我在这里做错了什么?
[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实例。
答案 0 :(得分:10)
仅在Django 1.4+中支持在distinct
中指定字段。如果你运行的是1.3,那就忽略它了。
如果 正在运行Django 1.4,则必须添加一个order_by
子句,其中包含distinct
中的所有字段并从中开始。
即使这样,指定带distinct
的字段也仅支持PostgreSQL。如果你正在运行其他东西,比如MySQL,那你就不走运了。
所有这些信息都在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()