Django:列出具有非唯一字段的所有对象

Fun*_*der 2 django django-queryset

如果我有以下模型:

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
Run Code Online (Sandbox Code Playgroud)

如何列出具有非唯一姓氏字段的所有对象?例如,如果有 20 个对象的姓氏均为“Smith”,则会列出它们。但是,如果只有一个对象的姓氏为“Euler”,则它不会包含在列表中。

Yuj*_*ita 6

这是 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)
Run Code Online (Sandbox Code Playgroud)


小智 5

你可能会想要施放listtonon_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))
Run Code Online (Sandbox Code Playgroud)