Django postgres order_by字段上的不同

时间:2017-01-24 16:35:01

标签: python django postgresql

我们对order_by / distinct字段有限制。 来自order_by()中的docs:“字段必须以distinct()中的字段开头,顺序相同”

现在是用例:

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

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

目标是获取课程,按最近的日期排序,但vip先行。

解决方案可能如下所示:

CourseEvent.objects.order_by('-course__is_vip', '-date',).distinct('course_id',).values_list('course')

但是由于限制,它会导致错误。

是的,我理解为什么在使用distinct时需要排序 - 我们为course_id的每个值得到第一行,所以如果我们不指定顺序,我们会获得一些任意行。 但是,将订单限制在我们不同的相同领域的目的是什么?

如果我将order_by更改为类似('course_id',' - course__is_vip','date'),它会为我提供一行课程,但课程顺序与目标没有任何共同之处。

除了遍历整个查询集并在循环中过滤它之外,有没有办法绕过这个限制?

1 个答案:

答案 0 :(得分:0)

您可以使用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)上的文档:

  

指定字段名称时,必须在QuerySet中提供order_by(),order_by()中的字段必须以distinct()中的字段开头,顺序相同。