繁体   English   中英

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

[英]Generating unique usernames from an email list for creating new users in django application

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

导入联系人有两个问题:

  1. 有的,我可能会被导入,可能已经存在于数据库中,在这种情况下,接触的,我希望添加其他联系人。

  2. 唯一的用户名。 除域名外,可能会有两封电子邮件相同。 例如。 如果是email@gmail.com,然后是email@outlook.com,则我需要使用不同的用户名,因此第一个用户名将类似于email,第二个用户名将是email1。

我已经实现了它们两个,并评论说清楚了。 可以使用更多的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

请让我知道其他/更好的流程/方法。

对于生成用户名,可能建议生成随机数,但我可以按顺序进行,因为这只是一次活动。

我想更改的一件事是处理第一个, 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类似地阻止,但这是您的选择。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM