24

我编写了 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。

如果有人能提供帮助,我将不胜感激。

4

2 回答 2

46

最后我设法弄清楚了。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()
于 2012-11-12T13:17:35.367 回答
9

对此更一般的规则:您需要创建新列 (by annotate),然后过滤该新列。此查询集将转换为HAVING关键字。

于 2012-11-13T20:09:26.917 回答