Django: список всех объектов с неуникальным полем - PullRequest
0 голосов
/ 31 декабря 2011

Если у меня есть следующая модель:

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

как мне перечислить все объекты, которые имеют неуникальное поле last_name?Например, если есть 20 объектов, которые имеют фамилию «Смит», они будут перечислены.Однако, если бы только один объект имел фамилию 'Эйлер', он не был бы включен в список.

Ответы [ 2 ]

3 голосов
/ 31 декабря 2011

Вот один способ с 2 запросами:

non_unique_last_names = (Person.objects
    .values_list('last_name', flat=True)
    .annotate(last_name_count=Count('last_name'))
    .filter(last_name_count__gt=1))

non_unique_person_objects = Person.objects.filter(last_name__in=non_unique_last_names)
2 голосов
/ 13 сентября 2018

Возможно, вы захотите привести list к non_unique_last_names, чтобы сражаться OperationalError: sub-select returns 2 columns - expected 1

Так что для тех, кто будет использовать этот код, правильная версия:

from django.db.models import Count
non_unique_last_names = (Person.objects
    .values_list('last_name', flat=True)
    .annotate(last_name_count=Count('last_name'))
    .filter(last_name_count__gt=1))

non_unique_person_objects = Person.objects.filter(last_name__in=list(non_unique_last_names))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...