Django postgres order_by distinct on field(按字段区分的Django postgres顺序)

2024-05-02 08:45:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我们对order\u by/distinct字段有限制。 从docs:“order为_by()的字段必须以distinct()中的字段开头,顺序相同”

下面是用例:

class Course(models.Model):
    is_vip = models.BooleanField()
    ...

class CourseEvent(models.Model):
    date = models.DateTimeField()
    course = models.ForeignKey(Course)

我们的目标是获取课程,按最近的日期订购,但vip优先。在

解决方案如下:

^{pr2}$

但由于这一局限性,导致了一个错误。在

是的,我理解为什么在使用distinct时排序是必要的-我们得到每个值的第一行,当然,如果我们不指定顺序,我们将得到一些任意行。 但是,把秩序限制在同一个领域的目的是什么?在

如果我将order_by更改为('course_id','-course_uis_vip','date',)它将给我一行课程,但课程的顺序与目标没有任何共同之处。在

除了遍历整个queryset并在循环中过滤它之外,还有什么方法可以绕过这个限制?在


Tags: docs目标datebymodel顺序modelsorder
1条回答
网友
1楼 · 发布于 2024-05-02 08:45:14

可以使用id__in使用嵌套查询。在内部查询中,您可以选择不同的事件,而在外部查询中,您可以对它们进行自定义排序:

CourseEvent.objects.filter(
    id__in=CourseEvent.objects\
        .order_by('course_id', '-date').distinct('course_id')
).order_by('-course__is_vip', '-date')

来自distinct(*fields)上的文档:

When you specify field names, you must provide an order_by() in the QuerySet, and the fields in order_by() must start with the fields in distinct(), in the same order.

相关问题 更多 >