Как реализовать предложение having в SQLite django ORM

18

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

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 |
+----+--------+--------+---------+---------------------+---------+

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

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

задан 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 ответа

34

Наконец, мне удалось разобраться. Синтаксис 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
источник