Выберите отличное в Джанго - PullRequest
2 голосов
/ 01 марта 2012

Что я здесь не так делаю?

[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, но теперь я простовернуть все экземпляры приложения.

Ответы [ 3 ]

10 голосов
/ 01 марта 2012
  1. Задание полей в distinct поддерживается только в Django 1.4+.Если вы используете 1.3, она просто игнорируется.

  2. Если вы работаете с Django 1.4, вы должны добавить предложение order_by, которое включает и начинается свсе поля в distinct.

  3. Даже в этом случае указание полей с помощью distinct поддерживается только в PostgreSQL.Если вы используете что-то еще, например MySQL, вам не повезло.

Вся эта информация находится в документах .

7 голосов
/ 01 марта 2012

Вы должны упорядочить то же имя поля при использовании отличного с именем поля:

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

Из doc :

Когда вы указываете имена полей, вы должны предоставить order_by () в QuerySet, а поля в order_by () должны начинаться с полей в Different (), в том же порядке.

Например, SELECT DISTINCT ON (a) дает вам первую строку для каждого значения в столбце a.Если вы не укажете заказ, вы получите произвольную строку.

2 голосов
/ 25 марта 2015

Вы можете использовать values_list () при использовании Different ().

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