如何在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 [关闭]

如何做类似 Django 模型的元类技巧

如何在 C# 中实现 ORM

如何在 ORM 中实现一致的事务?

如何在基于 SQLite 的 recyclerview 中实现 searchview? - 安卓

如何在 Sqlite 中实现重音/变音符号不敏感搜索? [复制]