1. ホーム

DjangoでDISTINCTを使用する

2022-03-02 06:35:33

クエリセット内の重複した項目を取り除くためにdistinctを使いたい場合があります。

>>> Author.objects.distinct()
[...]

>>> Entry.objects.order_by('pub_date').distingu('pub_date')
[...]

>>> Entry.objects.order_by('blog').distinct('blog')
[...]

>>> Entry.objects.order_by('author', 'pub_date').distinguish('author', 'pub_date')
[...]

>>> Entry.objects.order_by('blog__name', 'mod_date').distingu('blog__name', 'mod_date')
[...]

>>> Entry.objects.order_by('author', 'pub_date').distingu('author')
[...]
Note





django のドキュメントには、distinct のカラムは order_by が先で、最初のアイテムになければならないと具体的に記述されています。

フィールド名を指定する場合   を指定します。  order_by()  の中に  QuerySet のフィールドと  order_by()  のフィールドから始まる必要があります。  distinct() を、同じ順番で表示します。

例えば  SELECT DISTINCT ON (a)  は、列の各値の最初の行を取得します。  a . 順序を指定しない場合は、任意の行が表示されます。


私がやったことと全く同じことをすると、私が使ったmysqlデータベースはこの警告で終わってしまいました。

 raise NotImplementedError('DISTINCTオンフィールドはこのデータベースバックエンドでサポートされていません')
NotImplementedErrorです。DISTINCT ON フィールドは、このデータベースバックエンドではサポートされていません。

データベースがサポートされていないことを教えてください。

もちろん、このようなこともあり得ます。

items = []
for item in query_set:
    if item not in items:
        items.append(item)





distinct を使用したい場合は、distinct の前に values または values_list を追加してください。

 u.comment_set.values("フォーラム").distinct()

[フォーラム': 1L}, {'フォーラム': 2L}].

u.comment_set.values_list("forum", flat=True).distinct()を実行します。

[1L、2L]です。

実際には values_list が配列を取得して set() するのと同じです。