这是我想要获取这样的记录的模型,这些记录的 first_name 和 last_name 将是相同的
class Customer(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
first_name = models.CharField(max_length=120)
last_name = models.CharField(max_length=120)
我只尝试了此检查,名字或姓氏是相同的,但是我必须同时检查名字和姓氏一样。
这将检查姓氏是否相同。
duplicates = Customer.objects.values('last_name')
.annotate(name_count=Count('last_name'))
.filter(name_count__gt=1)
queryset = Customer.objects.filter(last_name__in=[item['last_name'] for item in duplicates])
.values()
这将检查名字是否相同。
duplicates = Customer.objects.values('first_name')
.annotate(name_count=Count('first_name'))
.filter(name_count__gt=1)
queryset = Customer.objects.filter(first_name__in=[item['first_name'] for item in duplicates])
.values()
任何帮助将不胜感激!
谢谢!
答案 0 :(得分:0)
您可以获得first_name
和last_names
的集合,它们通过以下方式多次出现:
duplicates = Customer.objects.values('first_name', 'last_name').annotate(
name_count=Count('pk')
).order_by('first_name', 'last_name').filter(name_count__gt=1)
您可以使用重复的Customer
/ first_name
组合来获取所有last_name
,并具有以下功能:
from functools import reduce
from operator import or_
duplicate_values = Customer.objects.values('first_name', 'last_name').annotate(
name_count=Count('pk')
).order_by('first_name', 'last_name').filter(name_count__gt=1)
duplicates = Customer.objects.filter(
reduce(or_, [Q(first_name=v['first_name'], last_name=v['last_name']) for v in duplicate])
)
但是请注意,您可以使用unique_together
[Django-doc]或django-2.2和UniqueConstraint
[Django-doc]来强制执行,使值在一起唯一,例如:
class Customer(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
first_name = models.CharField(max_length=120)
last_name = models.CharField(max_length=120)
class Meta:
constraints = [
UniqueConstraint(fields=['first_name', 'last_name'], name='uniquename')
]