Как реализовать условие, имеющееся в sqlite django ORM

20

Я написал синтаксис django sqlite orm для получения определенного набора записей:

from django.db.models.aggregates import Count

JobStatus.objects.filter(
    status='PRF'
).values_list(
    'job', flat=True
).order_by(
    'job'
).aggregate(
    Count(status)__gt=3
).distinct()

Но это дает мне ошибку, и SQL-эквивалент для этого синтаксиса прекрасно работает для меня.

Это мой sql-эквивалент.

SELECT *
  FROM tracker_jobstatus
 WHERE status = 'PRF'
 GROUP BY job_id
HAVING COUNT(status) > 3;

и я получаю результат следующим образом

+----+--------+--------+---------+---------------------+---------+
| id | job_id | status | comment | date_and_time       | user_id |
+----+--------+--------+---------+---------------------+---------+
| 13 |      3 | PRF    |         | 2012-11-12 13:16:00 |       1 |
| 31 |      4 | PRF    |         | 2012-11-12 13:48:00 |       1 |
+----+--------+--------+---------+---------------------+---------+

Я не могу найти эквивалент django sqlite для этого.

Буду очень признателен, если кто-нибудь сможет помочь.     

задан Kalanamith 12.11.2012 в 14:01
источник
  • Я спросил об этом в #django на Freenode некоторое время назад и получил ответ, что это было невозможно. Извините, что являюсь носителем плохих новостей. –  GlennS 12.11.2012 в 14:07
  • невозможно? если есть правильный учебник, мы можем понять это каким-то образом. Спасибо . –  Kalanamith 12.11.2012 в 14:09
  • Рад быть доказанным, спасибо. –  GlennS 14.11.2012 в 17:48
  • Добро пожаловать всегда GlennS –  Kalanamith 14.11.2012 в 19:24

2 ответа

36

Наконец-то я понял это. Синтаксис ORM примерно такой.

from django.db.models.aggregates import Count

JobStatus.objects.filter(
    status='PRF'
).values_list(
    'job', flat=True
).order_by(
    'job'
).annotate(
    count_status=Count('status')
).filter(
    count_status__gt=1
).distinct()
    
ответ дан Kalanamith 12.11.2012 в 14:17
  • awesome - спасибо за отправку вашего решения. –  Franco 14.09.2015 в 13:12
  • @Franco Добро пожаловать, –  Kalanamith 15.09.2015 в 10:03
7

Более общее правило для этого: вам нужно создать новый столбец (по annotate ), а затем отфильтровать этот новый столбец. Этот набор запросов будет преобразован в ключевое слово HAVING .

    
ответ дан Melevir 13.11.2012 в 21:09