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

问题描述 投票:0回答:2

如果我有以下型号:

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',则它不会包含在列表中。

django django-queryset
2个回答
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)

2
投票

你可能想把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))
© www.soinside.com 2019 - 2024. All rights reserved.