我们对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'),它会为我提供一行课程,但课程顺序与目标没有任何共同之处。
除了遍历整个查询集并在循环中过滤它之外,有没有办法绕过这个限制?
答案 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()中的字段开头,顺序相同。