2016-08-23 2 views
0

Я использую distinct() QuerySet для получения данных в Django.
Мой первоначальный запрос был Point.objects.order_by('chron', 'pubdate').
В некоторых случаях поле chron является дубликатом, поэтому я изменил запрос на Point.objects.order_by('chron', 'pubdate').distinct('chron'), чтобы исключить дубликаты. Теперь проблема в том, что все пустые поля считаются дублирующими.Запрос, исключая дубликаты в Django

Чтобы быть точным, поле chron содержит целые числа (которые ведут себя аналогично ids), в некоторых случаях это может быть дубликат, в некоторых случаях он может быть NULL.

| chron | 
|-------| 
| 1  | I want this 
| 2  | I want this 
| 3  | I want this 
| 3  | 
| NULL | 
| 4  | I want this 
| NULL | 

Я хочу, чтобы исключить все chron дубликаты, но не тогда, когда они являются дубликатом NULL. Спасибо.

+0

проверьте это. https://stackoverflow.com/questions/30084107/django-query-with-order-by-distinct-and-limit-on-postgresql. затем исключить для фильтрации нулевого результата. – Windsooon

ответ

2

Используйте два отдельных запроса.

  • .distinct("chron").exclude(chron__isnull=True)

  • .filter() только chron значений, где chron__isnull=True.

Хотя это кажется довольно неэффективный я верю (я с удовольствием будет исправлено), что даже любой разумный ваниль SQL заявление (например. Ниже) потребует несколько сканирования таблицы, чтобы присоединиться результирующий набор нулей и уникальных значений.

SELECT * 
FROM (
    SELECT chron 
    FROM Point 
    WHERE chron IS NOT NULL # .exclude() 
    GROUP BY chron # .distinct() 

    UNION ALL 

    SELECT chron 
    FROM Point 
    WHERE chron IS NULL # .include() 
) 
+0

Почему вы делаете 'GROUP BY' вместо' SELECT DISTINCT'? –

+0

Спасибо, он работал с небольшой настройкой: 'chron__isnull' вместо' chron__is_null', я думаю, потому что 'chron' является' IntegerField'. – isar

+0

Я обновляю ответ с исправленным синтаксисом. Обязательно отметьте, что вы ответили на вопрос. – Matt

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