如何在Django中检查重复的名称

这是我想要获取这样的记录的模型,这些记录的 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()

任何帮助将不胜感激!

谢谢!

vieto5006 回答:如何在Django中检查重复的名称

您可以获得first_namelast_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]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')
        ]
本文链接:https://www.f2er.com/3102630.html

大家都在问