1. ホーム
  2. sql

[解決済み] Djangoは重複するフィールド値を持つ行のみを選択する

2022-08-05 20:53:43

質問

django で以下のように定義されたモデルがあるとします。

class Literal:
    name = models.CharField(...)
    ...

Nameフィールドは一意ではないので、値が重複する可能性があります。以下のタスクを達成する必要があります。 モデルから 少なくとも1つの重複する値 name フィールドの少なくとも1つの重複値

私はプレーンSQLを使用してそれを行う方法を知っています(最良の解決策ではないかもしれません)。

select * from literal where name IN (
    select name from literal group by name having count((name)) > 1
);

では、django ORM を使ってこれを選択することは可能でしょうか?それとももっと良い SQL ソリューションですか?

どのように解決するのですか?

試してみてください。

from django.db.models import Count
Literal.objects.values('name')
               .annotate(Count('id')) 
               .order_by()
               .filter(id__count__gt=1)

これは Django で得られるものに限りなく近いです。問題は、これが ValuesQuerySet だけで namecount . しかし、これを利用して、通常の QuerySet を別のクエリにフィードバックすることで構築できます。

dupes = Literal.objects.values('name')
                       .annotate(Count('id'))
                       .order_by()
                       .filter(id__count__gt=1)
Literal.objects.filter(name__in=[item['name'] for item in dupes])