2017-01-24 10 views
0

order_by/distinctフィールドには制限があります。 docsから :今ここにDjango postgres order_by distinct on field

「をORDER_BY内のフィールドは、()と同じ順序で、)(個別の内のフィールドで始まる必要があり、」ユースケースである:

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

id__inを使用してネストされたクエリを使用できます。内側のクエリでは、個別のイベントを選び出すと外側のクエリは、カスタムオーダーそれらを:distinct(*fields)上のドキュメントから

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

:あなたはフィールド名を指定すると

すると、あなたが提供しなければなりませんOrder_by()はOrderSet()内のフィールドで始まり、order_by()のフィールドはdistinct()のフィールドで始まる必要があります。

+0

いいえ、それは私にコースIDで注文します。最も近い日付とVIPフラグではありません。 – Vilial

+0

2番目のorder_byは、その別の電話をかけて日付に関する情報を既に失っているので役に立ちません。 – Vilial

+0

いいえ、そうではありません。 2番目の 'order_by'はありません。 'course_id'ごとに最新のレコードがあります。入れ子にされた各クエリには1つの注文句があります。 – schwobaseggl