2

Gmail から連絡先をインポートしています。c_lst次のように辞書に名前と電子メールアドレスを持つリストです -[{'name': u'fn1 ln1', 'emails': [u'email1@gmail.com']}, {'name': u'fn2 ln2', 'emails': [u'email2@gmail.com']},.

連絡先のインポートには 2 つの問題があります。

  1. インポートする可能性のある連絡先の一部は、データベースに既に存在している可能性があります。その場合、別の連絡先を追加したくありません。

  2. 一意のユーザー名。ドメイン名を除いて、2 つの電子メールが同じである可能性があります。例えば。その場合は、email@gmail.com と次に email@outlook.com を指定します。最初のユーザー名が email のようになり、2 番目のユーザー名が 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

他の/より良いフロー/アプローチについて教えてください。

ユーザー名を生成するために、乱数を生成するようアドバイスする人もいるかもしれませんが、これは 1 回限りのアクティビティであるため、順番に行っても問題ありません。

4

1 に答える 1

0

The one thing I would like to change is to handle the first except explicitly. Since you are using:

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

It could raise a MultipleObjectsReturned exception then create an infinite loop in the current except block.

So you should at least change your code to:

# ... 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 ?

Well your might want to handle the second try except block similarly but that's your choice.

Hope this helps.

于 2013-07-24T21:09:44.187 に答える