2012-01-26 2 views
3

Запуск различных() на любом поле комментария модель всегда возвращает все записи,django комментарий структура: отличная() не работает?

Comment.objects.values ​​('пользователь') различны()

[{ 'пользователь':. 1 }, {'user': 0}, {'user': 0}, {'user': 0}, {'user': 0}, {'user': 1}, {'user': 1} , { 'пользователь': 1}, { 'пользователь': 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. значения() влияет на поля поиска в SELECT, части окончательного SQL (»values() takes optional positional arguments, *fields, which specify field names to which the SELECT should be limited ")
  2. order_by() также добавляет свой параметр к части SELECT.
  3. с использованием различных() в Ищут приведет к SQL, чтобы выглядеть следующим образом:

    ВЫБОР DISTINCT [fields1, fields2, fields3] FROM ... WHERE ...

    и значения полей вместе определяют, уникальна ли запись. Поля могут быть получены из функций value() или order_by() в поиске.

  4. So the order_by() is adding some unwanted effects when combined with distinct(), the fields specified in order_by is also take into consideration whether a record is unique

  5. Джанго Комментарий имеет скрытый order_by параметр по умолчанию, создавая тем самым всю проблему. Любая модель имеет скрытый order_by при возврате qs может вызвать ту же проблему.

  6. Способ решения проблемы заключается в добавлении пустого order_by() в конец поиска, который удаляет по умолчанию order_by.

ответ

4
Comment.objects.values('user').distinct().order_by() 
+0

если OP ищет идентификаторы различных пользователей, как ваши решения не работают на всех –

+0

@SimonKagwi И что же они вернуть? – DrTyrsa

+0

Привет, DrTyrsa! Я использую django 1.3, а параметр distinct() не описан в этой версии. Вторая команда не работает для модели комментариев, но отлично подходит для пользовательской модели (например, то, что я сказал в PS). Но почему «ценности» не должны влиять на «отличное» поведение? Если вы не укажете django, какие значения столбца следует использовать для группировки, как он может знать, каким образом вы хотите рассматривать записи как уникальные? –

3

Я не проверил, что это является причиной, но 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 

Это documented feature.

Теперь, как может быть, что два комментария имеют точно такую ​​же метку времени? Я полагаю, вы используете MySQL, который не поддерживает ничего меньше секунды.

И если вы хотите, чтобы избавиться от упорядочения по умолчанию, просто сделать:

Comment.objects.order_by().values('ip_address').distinct() 
+0

Спасибо большое! Скрытая структура order_by в комментариях является причиной всех проблем. В этом случае это очень нежелательная функция. –

+0

@ Xun: Я обновил свой ответ, чтобы показать, как избавиться от заказа по умолчанию. –

+0

Ах, извините, IO не видел, что вы уже поняли это :) –

Смежные вопросы