【问题标题】:how to check duplicate names in Django如何检查Django中的重复名称
【发布时间】:2019-11-14 12:30:05
【问题描述】:

这是我想要获取 first_namelast_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)

我试过这个检查只有 first_namelast_name 相同,但我必须同时检查 first_namelast_name是一样的。

这会检查姓氏是否相同。

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()

这会检查 first_names 是否相同。

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()

我们将不胜感激!

谢谢!

【问题讨论】:

  • 为什么不用unique_together 标记first_namelast_name
  • 抱歉,先生回复晚了。我正在使用 Django-2.0

标签: django django-models django-forms django-templates django-views


【解决方案1】:

您可以通过以下方式获得多次出现的first_names 和last_namess 的集合:

duplicates = Customer.objects.values('first_name', 'last_name').annotate(
    name_count=Count('pk')
).order_by('first_name', 'last_name').filter(name_count__gt=1)

您可以通过以下方式获得所有Customers 与重复的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')
        ]

【讨论】:

  • 感谢解决问题已解决。
  • 先生,我如何从客户那里获取重复记录??
  • queryset = Customer.objects.filter(last_name__in=[item['last_name'] for item in duplicates], first_name__in=[item['first_name'] for item in duplicates]).values()
  • queryset = Customer.objects.filter( reduce(or_, [Q(first_name=v['first_name'], last_name=v['last_name']) for v in duplicates])).values()
猜你喜欢
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多