是否有一种简单的方法可以删除以下基本查询中的重复项 -
email_list = Emails.objects.order_by('email')
Run Code Online (Sandbox Code Playgroud)
我尝试使用duplicate(),但它无法正常工作.你能告诉我没有重复的查询的确切语法吗?谢谢.
Dan*_*man 94
此查询不会给您重复 - 即,它将为您提供数据库中的所有行,通过电子邮件排序.
但是,我认为你的意思是你的数据库中有重复的数据.在distinct()
这里添加也没有用,因为即使你只有一个字段,你也有一个自动id
字段 - 所以id + email的组合不是唯一的.
假设您只需要一个字段,email_address
重复数据删除,您可以这样做:
email_list = Email.objects.values_list('email', flat=True).distinct()
Run Code Online (Sandbox Code Playgroud)
但是,您应该确实修复根问题,并从数据库中删除重复数据.
例如,通过电子邮件字段删除重复的电子邮件:
for email in Email.objects.values_list('email', flat=True).distinct():
Email.objects.filter(pk__in=Email.objects.filter(email=email).values_list('id', flat=True)[1:]).delete()
Run Code Online (Sandbox Code Playgroud)
或书名:
for name in Book.objects.values_list('name', flat=True).distinct():
Book.objects.filter(pk__in=Artwork.objects.filter(name=name).values_list('id', flat=True)[3:]).delete()
Run Code Online (Sandbox Code Playgroud)
您可以.distinct()
在查询集的末尾链接以过滤重复项.查看:http://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.distinct
对于检查重复,你可以做一个GROUP_BY
,并HAVING
在Django
下面。我们在annotations
这里使用Django 。
from django.db.models import Count
from app.models import Email
duplicate_emails = Email.objects.values('email').annotate(email_count=Count('email')).filter(email_count__gt=1)
Run Code Online (Sandbox Code Playgroud)
现在遍历以上数据并删除emails
除第一个数据以外的所有其他数据(取决于需求或其他)。
for data in duplicates_emails:
email = data['email']
Email.objects.filter(email=email).order_by('pk')[1:].delete()
Run Code Online (Sandbox Code Playgroud)
您可以使用此distinct()
功能,具体取决于您的型号.如果您只想从模型中检索单个字段,则可以执行以下操作:
email_list = Emails.objects.values_list('email').order_by('email').distinct()
Run Code Online (Sandbox Code Playgroud)
这应该会给你一个有序的电子邮件列表.
归档时间: |
|
查看次数: |
46404 次 |
最近记录: |