web-dev-qa-db-ja.com

Django distinct_)を使用したorder_by()フィルター

order_by このような ....

p = Product.objects.filter(vendornumber='403516006')\
                   .order_by('-created').distinct('vendor__name')

問題は、同じ名前の複数のベンダーがあり、ベンダーによる最新の製品のみが必要なことです。

それが理にかなっていることを望みますか?

このDBエラーが発生しました:

SELECT DISTINCT ON式は、最初のORDER BY式と一致する必要がありますLINE 1:SELECT DISTINCT ON( "search_vendor"。 "name") "search_product" ...

34
pkdkk

あなたのエラーメッセージと この他の質問 に基づいて、これはそれを修正すると思われます:

p = Product.objects.filter(vendornumber='403516006')\
               .order_by('vendor__name', '-created').distinct('vendor__name')

つまり、DISTINCT ON式は左端のORDER BY式と一致する必要があるようです。したがって、distinctで使用する列をorder_byの最初の列として作成することで、機能するはずです。

43
janos

左端のorder_by()argとdistinct()を一致させるだけでは機能せず、同じエラー(Django 1.8.7のバグまたは機能)が発生しましたか?

qs.order_by('project').distinct('project')

ただし、次のように変更すると機能しました:

qs.order_by('project_id').distinct('project')

また、複数のorder_by引数もありません。

9
Dmitriy Sintsov

私は同様の問題を抱えていましたが、その後に関連するフィールドがありました。 distinct()に関連フィールドを追加しただけでは、正しい結果が得られませんでした。

room__nameでソートして、personresidencyにリンク)を一意に保ちたいと思いました。以下のように関連フィールドを繰り返すと、問題が修正されました。

.order_by('room__name', 'residency__person', ).distinct('room__name', 'residency__person')

関連記事もご覧ください。

2
SaeX

別のフィールドで区別して並べ替えるために別のフィールドを使用したい場合は、以下のコードを使用できます

from Django.db.models import Subquery

Model.objects.filter(
    pk__in=Subquery(
       Model.objects.all().distinct('foo').values('pk')
    )
).order_by('bar')
1
kophygiddie