如何删除django中的重复用户?

时间:2010-04-27 15:57:19

标签: django authentication

我需要删除django中的重复用户(重复一次是指两个或更多用户使用相同的电子邮件)。

例如,如果有三个这样的记录:

id    email
3     c@c.com
56    c@c.com
90    c@c.com

我需要删除记录56和90并保留最早的记录ID - > 3

有没有办法快速做到这一点。

谢谢:)

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()
相关问题