![](/img/trans.png)
[英]django: order_by and distinct OK; then order_by another field… HowTo?
[英]Django postgres order_by distinct on field
我們對order_by / distinct字段有限制。 從文檔中 :“ order_by()中的字段必須以相同順序從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',)之類的東西,它將給我一行課程,但是課程的順序與目標沒有任何共同之處。
除了遍歷整個查詢集並對其進行循環過濾之外,是否有任何方法可以繞過此限制?
您可以使用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()中的字段開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.