在 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 中获取重复项的主要内容,如果未能解决你的问题,请参考以下文章
[oldboy-django][2深入django]Form组件功能: 数据格式验证 + 保留上次输入的值(如果有很多输入项,这样正确项不必重复输入,错误项也能提示错误信息)