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

Python 从电子邮件列表生成唯一用户名,以便在django应用程序中创建新用户,python,django,django-users,Python,Django,Django Users,我正在从gmail导入联系人c_lst是一个在字典中包含姓名和电子邮件地址的列表,如下所示-[{'name':u'fn1 ln1','emails':[u'email1@gmail.com']},{'name':u'fn2 ln2','email':[u'email2@gmail.com“]},. 导入联系人时存在两个问题: 我可能要导入的某些联系人可能已经存在于数据库中,在这种情况下,我不想添加其他联系人 唯一的用户名。除了域名外,两封电子邮件可能是相同的。email@gmail.com然后e

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

导入联系人时存在两个问题:

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

  • 唯一的用户名。除了域名外,两封电子邮件可能是相同的。email@gmail.com然后email@outlook.com在这种情况下,我需要有不同的用户名,以便第一个用户名类似于email,第二个用户名类似于email1

  • 我已经实现了这两个功能,并发表了评论,以使事情变得清晰。 还有比这更像蟒蛇的方法吗

    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
    
    请让我知道任何其他/更好的流程/方法

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

    我想更改的一件事是显式处理第一个
    ,除了
    。因为您正在使用:

    u = Users.objects.get(email=email)  # don't add space before and after "=" in argument
    
    它可能引发一个
    multipleobjectsreerned
    异常,然后在当前
    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 ?
    
    您可能希望处理第二个
    块,但类似地尝试
    块除外,但这是您的选择


    希望这有帮助。

    我认为更好的方法是使用电子邮件地址作为用户名。可能会有帮助。也可能有用。这是一个有意识的设计决策,而不是这样做。@user1629366,而不是添加
    str(idx)
    对于用户名,您可以使用类似于
    email\u 1
    email-1
    的东西,现在不再使用
    while
    循环,您只需在
    \u
    -
    之后获取数字,然后将其递增并附加到用户名中。这将很有帮助,因为如果1000个用户拥有相同的用户名部分,那么您的
    while
    循环将迭代1000次,如果您使用不同的用户名类型,则可以跳过该循环。如果我以我拥有的代码开始,一封电子邮件只对应一个用户,因此不存在多个用户因同一封电子邮件而被返回的问题。问题是如何做更具pythonic风格的事情,您应该抓住例外你想抓住的东西;)