3

我想为每个日期返回 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()
4

1 回答 1

1

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

AssertionError
Cannot combine queries once a slice has been taken.

这是视图代码:

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

错误是针对 line 发出的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 文章并回答:

如何使用子查询 django ORM?

其中说了一堆东西,并暗示您可以使用不同的 ORM (SQLAlchemy) 来做您想做的事情。我听说过有关 SQLAlchemy 的好消息。

于 2013-07-09T05:09:59.680 回答