фреймворк комментариев django: Different () не работает? - PullRequest
5 голосов
/ 26 января 2012

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

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

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

Бит заключения Спасибо всем, кто ответил на этот вопрос, в сочетании с чтением я получаю следующее заключение:

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

    SELECT DISTINCT [fields1, fields2, fields3] ОТ ... ГДЕ ...

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

  4. Таким образом, order_by () добавляет некоторые нежелательные эффекты в сочетании с Different (), поля, указанные в order_by, также учитывают, является ли запись уникальной

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

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

Ответы [ 2 ]

8 голосов
/ 26 января 2012
Comment.objects.values('user').distinct().order_by()
3 голосов
/ 26 января 2012

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

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

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

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

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