如果我有以下型号:
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',则它不会包含在列表中。
答案 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))