我需要删除django中的重复用户(重复一次是指两个或更多用户使用相同的电子邮件)。
例如,如果有三个这样的记录:
id email
3 c@c.com
56 c@c.com
90 c@c.com
我需要删除记录56和90并保留最早的记录ID - > 3
有没有办法快速做到这一点。
谢谢:)
答案 0 :(得分:3)
RZ的回答实际上几乎是正确的。我不知道这是不是最好的方式,但它确实有效。因此,对于这一次目的,您可以使用它。
但是,我想添加并更正一些内容。
from django.contrib.auth.models import User
def delete_duplicate_users():
// first find all email addresses (with kind of a 'group by')
emails = User.objects.values('email').distinct()
for e in emails:
users = User.objects.filter(email=e['email']).order_by('date_joined')[1:]
for u in users:
u.delete()
我用一个小例子尝试了这个并且它有效。但我强烈建议您在生产系统上实际使用它之前对其进行测试!
希望对你有所帮助。
//编辑
我还建议您在电子邮件已注册时不允许添加用户。应该有一些内置的方法来实现这一点。如果没有,您可以使用自己的用户模型将Djangos用户模型子类化,并覆盖保存方法。
答案 1 :(得分:1)
users = User.objects.filter(email='c@c.com').order_by('join_date')[1:]
for u in users:
u.delete()
我忘记了如果查询集支持如上所述的切片,并且现在无法测试。如果他们不这样做,你只需要提取第一个元素并删除其余元素。
答案 2 :(得分:0)
您可以获得这样的电子邮件地址。
from django.contrib.auth.models import User
from django.db.models import Count
duplicate_emails = [i['email'] for i in User.objects.values('email').annotate(
Count('email')).filter(email__count__gt=1)]
然后,您可以遍历电子邮件地址并决定如何处理它们。此示例删除具有较旧last_login日期的用户。
for email in duplicate_emails:
user = User.objects.filter(email=email).order_by('last_login')[0]
user.delete()