django评论框架:distinct()不起作用?

Xun*_*ang 6 django distinct django-comments

在注释模型的任何字段上运行distinct()始终返回所有记录,

Comment.objects.values( '用户').不同的()

[{'user':1},{'user':0},{'user':0},{'user':0},{'user':0},{'user':1},{ 'user':1},{'user':1},{'user':1}]

Comment.objects.values( 'IP_ADDRESS').不同的()

[{'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()在我的测试期间在自定义模型的不同类型的字段中运行得非常好.关于评论框架的一些特别之处?

结论总结 感谢大家回答这个问题,再加上一些阅读,我得出如下结论:

  1. values()影响最终sql的SELECT部分​​中的查找字段(" values()采用可选的位置参数,*字段,指定SELECT应限制的字段名称 ")
  2. order_by()也将其参数添加到SELECT部分​​.
  3. 在查找中使用distinct()将导致sql看起来像这样:

    SELECT DISTINCT [fields1,fields2,fields3] FROM ... WHERE ...

    并且所有字段的值一起决定记录是否唯一.这些字段可能来自查找中的values()或order_by()函数.

  4. 因此order_by()在与distinct()结合时添加一些不需要的效果,order_by中指定的字段也会考虑记录是否唯一

  5. Django Comment默认有一个隐藏的order_by参数,从而创建了整个问题.任何模型在返回qs时都会隐藏order_by会导致同样的问题.

  6. 解决它的方法是在查找结束时添加一个空的order_by(),这将删除默认的order_by.

DrT*_*rsa 9

Comment.objects.values('user').distinct().order_by()
Run Code Online (Sandbox Code Playgroud)


Tom*_*ski 6

我还没有验证这是原因,但Comment模型有一个影响distinct()方法的默认排序:

In [1]: print Comment.objects.values('ip_address').distinct().query
SELECT DISTINCT "django_comments"."ip_address", "django_comments"."submit_date" FROM "django_comments" ORDER BY "django_comments"."submit_date" ASC
Run Code Online (Sandbox Code Playgroud)

这是一个记录在案的功能

现在,怎么可能两条评论具有完全相同的时间戳?我想你使用的 MySQL 不支持任何少于一秒的内容。

如果您想摆脱默认排序,只需执行以下操作:

Comment.objects.order_by().values('ip_address').distinct()
Run Code Online (Sandbox Code Playgroud)