在评论模型的任何字段上运行distinct()总是返回所有记录,
Comment.objects.values('user').distinct()
[{'用户': 1}, {'用户': 0}, {'用户': 0}, {'用户': 0}, {'用户': 0},
{'用户':1},{'用户':1},{'用户':1},{'用户':1}]
Comment.objects.values('ip_address').distinct()
[{'ip_address': u'127.0.0.1'},{'ip_address': u'192.168.0.180'},
{'ip_address':u'192.168.0.180'}, {'ip_address':u'192.168.0.180'},
{'ip_address': u'192.168.0. 180'}, {'ip_address': u'192.168.0.180'},
{'ip_address': u'192.168.0.180'}, {'ip_address': u'192.168.0.180'},
{'ip_address': u'192.168.0.180'}]
为什么会发生这种情况?有没有解决的办法?谢谢!
ps:在我的测试过程中,distinct() 在自定义模型的不同类型字段中确实运行得很好。评论框架有什么特别之处吗?
一点结论感谢大家回答这个问题,结合一些阅读,我得出以下结论:
- value() 影响最终的 SELECT 部分中的查找字段
sql("value() 接受可选的位置参数 *fields,其中
指定 SELECT 应限制的字段名称 https://docs.djangoproject.com/en/1.3/ref/models/querysets/#values")
- order_by() 也将其参数添加到 SELECT 部分。
-
在查找中使用distinct()将导致sql看起来像这样:
SELECT DISTINCT[字段1、字段2、字段3] 来自...哪里...
字段的值共同决定记录是否唯一。这些字段可能来自查找中的 value() 或 order_by() 函数。
因此,order_by()与distinct()结合时会增加一些不必要的效果,order_by中指定的字段也会考虑记录是否唯一 https://docs.djangoproject.com/en/1.3/ref/models/querysets/#distinct
Django Comment 默认有一个隐藏的 order_by 参数,从而产生了整个问题。任何模型在返回 qs 时都有一个隐藏的 order_by 可能会导致同样的问题。
- 解决的方法是在末尾添加一个空的order_by()
查找,删除默认的 order_by。
Comment.objects.values('user').distinct().order_by()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)