簡體   English   中英

Django Postgres order_by在字段上不同

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM