在Django中选择distinct

时间:2012-03-01 15:29:11

标签: python django python-2.6

我在这里做错了什么?

[app.system_name for app in App.objects.all().distinct('system_name')]

给我:

[u'blog', u'files', u'calendar', u'tasks', u'statuses', u'wiki', u'wiki', u'blog
', u'files', u'blog', u'ideas', u'calendar', u'wiki', u'wiki', u'statuses', u'ta
sks', u'survey', u'blog']

正如您所料,我想要字段system_name的所有唯一值,但现在我只需要返回所有App实例。

3 个答案:

答案 0 :(得分:10)

  1. 仅在Django 1.4+中支持在distinct中指定字段。如果你运行的是1.3,那就忽略它了。

  2. 如果 正在运行Django 1.4,则必须添加一个order_by子句,其中包含distinct中的所有字段并从中开始。

    < / LI>
  3. 即使这样,指定带distinct的字段也仅支持PostgreSQL。如果你正在运行其他东西,比如MySQL,那你就不走运了。

  4. 所有这些信息都在docs

答案 1 :(得分:7)

使用带有字段名称的order by时,您必须distinct使用相同的字段名称:

App.objects.order_by('system_name').distinct('system_name')

来自doc

  

指定字段名称时,必须在中提供order_by()   QuerySet和order_by()中的字段必须以字段开头   distinct(),顺序相同。

     

例如,SELECT DISTINCT ON(a)为每个提供第一行   列a中的值。如果您没有指定订单,您将获得一些订单   任意行。

答案 2 :(得分:2)

使用distinct()时可以使用values_list()。

App.objects.values_list('system_name').distinct()