Структура комментариев django: отличная () не работает?

Выполнение функции independent () для любого поля модели комментариев всегда возвращает все записи,

Комментарий.objects.values ​​('пользователь'). Different ()

[{'user': 1}, {'user': 0}, {'user': 0}, {'user': 0}, {'user': 0}, {'user': 1}, { 'пользователь': 1}, {'пользователь': 1}, {'пользователь': 1}]

Комментарий.objects.values ​​('ip_address'). Independent ()

[{'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: Different () очень хорошо работает в разных типах полей пользовательской модели во время моего теста. Что-то особенное в структуре комментариев?

Заключение. Спасибо всем, кто ответил на этот вопрос. В сочетании с некоторым прочтением я пришел к следующему выводу:

  1. values ​​() влияет на поля поиска в части SELECT окончательного sql ("values ​​() принимает необязательные позиционные аргументы, * поля, которые определяют имена полей, которыми должен быть ограничен SELECT ")
  2. order_by () также добавляет свой параметр в часть SELECT.
  3. # P9 #
    # P10 #
    # P11 #
  4. Таким образом, order_by () добавляет некоторые нежелательные эффекты в сочетании с отличным () , поля, указанные в order_by, также учитывают уникальность записи

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

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

person Xun Yang    schedule 26.01.2012    source источник


Ответы (3)


Я не проверял, что это причина, но _ 1_ модель имеет порядок по умолчанию, который влияет на 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

Это задокументированная функция.

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

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

Comment.objects.order_by().values('ip_address').distinct()
person Tomasz Zieliński    schedule 26.01.2012
comment
Большое спасибо! Скрытый order_by в структуре комментариев является причиной всех проблем. В данном случае это очень нежелательная функция. - person Xun Yang; 26.01.2012
comment
@Xun: Я обновил свой ответ, чтобы показать, как избавиться от порядка по умолчанию. - person Tomasz Zieliński; 26.01.2012
comment
Ах, извините, IO не видел, чтобы вы уже это поняли :) - person Tomasz Zieliński; 26.01.2012
comment
Вы достаточно ясно дали понять, я был бы более чем счастлив, если бы можно было отметить оба ответа как ответ :) - person Xun Yang; 26.01.2012

Вы можете заключить свой запрос в набор;

Отдельный () не подходит для values ​​() согласно документация

ip_sets = set(Comment.objects.order_by().values('ip_address'))
ip_list = list(set(Comment.objects.order_by().values('ip_address')))
person 7guyo    schedule 22.03.2021

person    schedule
comment
если OP ищет разные идентификаторы пользователей, оба ваших решения вообще не работают - person Simon Kagwi; 26.01.2012
comment
@SimonKagwi А что они возвращают? - person DrTyrsa; 26.01.2012
comment
Привет, DrTyrsa! Я использую django 1.3, а параметр отдельной () не задокументирован в этой версии. Вторая команда не работает для модели комментариев, но подходит для пользовательской модели (например, то, что я сказал в PS). Но почему «ценности» не должны влиять на «отличное» поведение? Если вы не укажете django, какие значения столбца следует использовать для группировки, как он может узнать, каким образом вы хотите рассматривать записи как уникальные? - person Xun Yang; 26.01.2012