是否有一种简单的方法可以删除以下基本查询中的重复项 -
email_list = Emails.objects.order_by('email')
我尝试使用duplicate()但它无法正常工作。你能告诉我没有重复的查询的确切语法吗?谢谢。
答案 0 :(得分:84)
这个查询不会给你重复 - 也就是说,它会给你数据库中的所有行,通过电子邮件排序。
但是,我认为你的意思是你的数据库中有重复的数据。在此添加distinct()
无济于事,因为即使您只有一个字段,您也有一个自动id
字段 - 因此ID +电子邮件的组合不是唯一的。
假设您只需要一个字段email_address
,重复数据删除,您可以这样做:
email_list = Email.objects.values_list('email', flat=True).distinct()
但是,您应该确实修复根问题,并从数据库中删除重复数据。
示例,通过电子邮件字段删除重复的电子邮件:
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()
或书名:
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()
答案 1 :(得分:7)
您可以在查询集的末尾链接.distinct()
以过滤重复项。查看:http://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.distinct
答案 2 :(得分:5)
您可以使用distinct()
功能,具体取决于您的型号。如果您只想从模型中检索单个字段,则可以执行以下操作:
email_list = Emails.objects.values_list('email').order_by('email').distinct()
应该为您提供有序的电子邮件列表。
答案 3 :(得分:4)
要检查重复项,您可以在GROUP_BY
中执行HAVING
和Django
,如下所示。我们在这里使用Django annotations
。
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)
现在循环上述数据并删除除第一个之外的所有其他emails
(取决于要求或其他)。
for data in duplicates_emails:
email = data['email']
Email.objects.filter(email=email).order_by('pk')[1:].delete()
答案 4 :(得分:2)
您也可以使用set()
email_list = set(Emails.objects.values_list('email', flat=True))
答案 5 :(得分:0)
我使用以下内容实际从数据库中删除重复的条目,希望这有助于其他人。
adds = Address.objects.all()
d = adds.distinct('latitude', 'longitude')
for address in adds:
if i not in d:
address.delete()
答案 6 :(得分:0)
你可以使用这个原始查询:your_model.objects.raw("select * from appname_Your_model group by column_name")