sql - Django限制分组查询的方法

标签 sql django postgresql django-orm

我想为每个日期返回 3 个结果,并按日期和每个查询的单独“评级”列对结果进行排序

例如,我的查询会返回如下内容:

Event on Dec 1st rated 36
Event on Dec 1st rated 29
Event on Dec 1st rated 12
Event on Dec 2nd rated 45
Event on Dec 2nd rated 12
Event on Dec 2nd rated 9
Event on Dec 3rd rated 118
Event on Dec 3rd rated 15
Event on Dec 3rd rated 13

我知道这应该可以使用像这样的原始 sql:SQL group - limit

但我想知道在 Django ORM 中是否有一种方法可以在单个查询中执行此操作,或者如果我确实需要转换为原始 SQL 查询,至少有一种方法可以使其尽可能轻松。

编辑: 模型很简单。相关领域是:

class Event(models.Model):
  title = models.CharField(max_length=120)
  day = models.DateField()
  score = models.SmallIntegerField()

最佳答案

我试图组装一个查询集的联合,但 django 提示:

AssertionError
Cannot combine queries once a slice has been taken.

这是 View 代码:

def home2(request):

    dates_qs = Event.objects.values('day').order_by('day').distinct()

    ev_qss = []
    for date in dates_qs:
        my_qs = Event.objects.filter(day=date['day']).order_by('score')[:3]
        ev_qss.append(my_qs)

    answer_qs = ev_qss[0]
    for qs in ev_qss[1:]:
        answer_qs |= qs

    return render_to_response ('home2.html',
                               {'dates_qs':dates_qs,
                                'answer_qs':answer_qs},
                               RequestContext(request))

错误是针对 answer_qs |= qs 行发出的,即想要取 answer_qs 和 qs 的并集。 qs 是一个日期分数的查询集,限制为 3 个结果。

所以我猜你被原始 SQL 困住了。您指向的原始 SQL 示例在多个表中有数据,而您的所有数据都在一个表中,因此您的 SQL 更简单一些:

SELECT sE.* FROM so_event AS sE
WHERE 3>(
         SELECT COUNT(*)
         FROM so_event iE
         WHERE iE.day = sE.day AND
         sE.score - iE.score < 0
)
ORDER BY sE.day ASC, sE.score DESC;

现在我知道这是我们的目标查询,我搜索了 django orm 子查询,并遇到了这篇 SO 文章和答案:

How to django ORM with a subquery?

它说了一大堆东西,并暗示你可以用不同的 ORM (SQLAlchemy) 做你想做的事。我听说过有关 SQLAlchemy 的好消息。

关于sql - Django限制分组查询的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17302380/

相关文章:

MySQL:如何改进这个 UNION?

css - 如何在 SQL 语句中放置 div 类?

django - 如何在 Django 项目中找到我的项目名称?

sql - 如果数组重叠,则折叠多行数组

postgresql - 当添加两个或更多权限条件时,Hasura 查询变得指数级变慢

sql 别名字段

java - (JDBC) 带有 if 语句和多个条件的 Mysql 查询

python - Django:检查是否设置了设置变量

django - 使用 Django 的管理界面将大文件上传到 GAE

sql - 如何在 PostgreSQL 中仅列出表的属性名称