如何在sqlite django ORM中实现have子句
Posted
技术标签:
【中文标题】如何在sqlite django ORM中实现have子句【英文标题】:How to implement the having clause in sqlite django ORM 【发布时间】:2012-10-31 21:42:16 【问题描述】:我已经编写了 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。
如果有人能提供帮助,我将不胜感激。
【问题讨论】:
前段时间我在 Freenode 上的#django 中询问过这个问题,得到的答复是不可能的。很抱歉成为坏消息的承担者。 不可能?如果有适当的教程,我们可以用任何方式弄清楚。谢谢。 很高兴被证明是错误的,谢谢。 【参考方案1】:我终于弄明白了。 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()
【讨论】:
【参考方案2】:对此的更一般规则:您需要创建新列(annotate
),然后过滤该新列。此查询集将转换为 HAVING
关键字。
【讨论】:
以上是关于如何在sqlite django ORM中实现have子句的主要内容,如果未能解决你的问题,请参考以下文章
Android SQLite 和数据库方案上的 ORM [关闭]