在 django 中获取重复项

Posted

技术标签:

【中文标题】在 django 中获取重复项【英文标题】:Get duplicates in django 【发布时间】:2016-01-09 04:17:09 【问题描述】:

我的数据库中有这个名称字段,其中很多名称是重复的。我想让它们独一无二。我知道我可以设置unique = True,但这只会对以后的条目有所帮助。我想知道所有具有重复名称的当前条目。有没有一种简单的方法可以打印出医生模型中重复的所有名称?

class Doctor(models.Model):
   name = models.CharField(max_length=1300)

【问题讨论】:

Django select only rows with duplicate field values的可能重复 【参考方案1】:

要从数据库中删除所有重复项,您必须先问自己一个问题 - 如何处理它们?消除?以某种方式合并?更改每个副本的名称?

回答完该问题后,只需构建数据迁移(使用 RunPython 迁移)将对每个重复条目执行所需的操作。

要查找所有重复项,您可以:

from django.db.models import Count
with_duplicates = Doctor.objects.annotate(count=Count('id')).order_by('id').distinct('name').filter(count__gt=1)

该查询将首先从数据库中获取(按 id)记录,从重复组中获取(例如,如果您有 3 个名为“who”的医生,它将首先获取其中的一个,并且仅获取具有重复项的医生)。

这样,对于每个有重复的医生,您可以获得重复的列表:

with_duplicates = Doctor.objects.annotate(count=Count('id')).order_by('id').distinct('name').filter(count__gt=1)
for doctor in with_duplicates:
    duplicates = Doctor.objects.filter(name=doctor.name).exclude(id=doctor.id)

和他们一起做点什么。

【讨论】:

请注意,Sqlite 后端尚不支持qs.distinct('fieldname')【参考方案2】:

类医生(models.Model): name = models.CharField(max_length=1300, unique = True)

【讨论】:

以上是关于在 django 中获取重复项的主要内容,如果未能解决你的问题,请参考以下文章

如何在django模板中实现列表迭代[重复]

Django 使用查询集和正则表达式查找重复项

Django-仅在存在字段时删除重复项

删除 Django ORM 中的重复项——多行

合并列表中的重复项? - 问题比看起来更复杂

[oldboy-django][2深入django]Form组件功能: 数据格式验证 + 保留上次输入的值(如果有很多输入项,这样正确项不必重复输入,错误项也能提示错误信息)