从电子邮件列表生成唯一用户名,以便在django应用程序中创建新用户

时间:2013-07-24 10:44:21

标签: python django django-users

我从gmail导入联系人。 c_lst是字典中包含姓名和电子邮件地址的列表,如下所示 - [{'name': u'fn1 ln1', 'emails': [u'email1@gmail.com']}, {'name': u'fn2 ln2', 'emails': [u'email2@gmail.com']},.

导入联系人有两个问题:

  1. 我可能导入的某些联系人可能已经存在于数据库中,在这种情况下,我想要添加其他联系人。

  2. 唯一的用户名。除域名外,两封电子邮件可能相同。例如。在这种情况下,我需要拥有不同的用户名,因此第一个用户名就像电子邮件,第二个用户名就是email1。

  3. 我已经实施了这两个,并评论说清楚。 可以有更多的pythonic方式吗?

    for contact in c_lst:
    email = contact.get('emails')[0]
    name = contact.get('name').split(' ')
    first_name, last_name = name[0], name[-1]
    try:
        # check if there is already a user, with that email address
        # if yes then ignore.
        u = Users.objects.get(email = email)
        print "user exists"
    except:
        while True:
            username = email.split('@')[0]
            name, idx = username, 1 
            try:
                # user with current username exists, so add numeral
                Users.objects.get(username = username)
                name = username + str(idx)
            except User.DoesNotExist:
                username = name
                u = User.objects.create(username = username, email = email, first_name = first_name, last_name = last_name)
                u.save()
                break
    

    请告诉我任何其他/更好的流程/方法。

    为了生成用户名,可以建议生成随机数,但对我来说没问题 按顺序进行,因为它只是一次活动。

1 个答案:

答案 0 :(得分:0)

我想改变的一件事是明确处理第一个except。由于您使用:

u = Users.objects.get(email=email)  # don't add space before and after "=" in argument

它可能会引发MultipleObjectsReturned异常,然后在当前except块中创建一个无限循环。

因此,您至少应该将代码更改为:

# ... your code ...
first_name, last_name = name[0], name[-1]
try:
    u = Users.objects.get(email=email)
except User.DoesNotExist:
    # ... your code ....
except User.MultipleObjectsReturned:
    # handle this case differently ?

您可能想要同样处理第二个try except块,但这是您的选择。

希望这有帮助。