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

时间:2011-12-31 08:02:48

标签: django django-queryset

如果我有以下型号:

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

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

2 个答案:

答案 0 :(得分:3)

以下是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)

答案 1 :(得分:1)

您可能希望将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))