Python 从电子邮件列表生成唯一用户名,以便在django应用程序中创建新用户
我正在从gmail导入联系人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
c_lst
是一个在字典中包含姓名和电子邮件地址的列表,如下所示-[{'name':u'fn1 ln1','emails':[u'email1@gmail.com']},{'name':u'fn2 ln2','email':[u'email2@gmail.com“]},.
导入联系人时存在两个问题:
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风格的事情,您应该抓住例外你想抓住的东西;)