2013-07-24 10 views
2

Gmail에서 연락처를 가져오고 있습니다.django 응용 프로그램에서 새 사용자 생성을위한 이메일 목록에서 고유 한 사용자 이름 생성

  1. I 가져 오기 할 수있는 연락처 중 일부를 이미 수 있습니다 : [{'name': u'fn1 ln1', 'emails': [u'[email protected]']}, {'name': u'fn2 ln2', 'emails': [u'[email protected]']},.

    가져 연락처 두 가지 문제가 있습니다 - c_lst 다음과 같이 사전에 이름과 이메일 주소가 목록입니다 이 경우 데이터베이스에있는, 내가 할 아니 다른 연락처를 추가하고 싶습니다.

  2. 고유 사용자 이름. 도메인 이름을 제외하고 두 개의 전자 메일이 동일 할 가능성이 있습니다. 예. [email protected]을 입력 한 다음 [email protected]을 입력하면 별개의 사용자 이름이 필요하므로 첫 번째 사용자 이름은 이메일과 같을 것이고 두 번째 사용자 이름은 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 

다른/더 나은 흐름/접근 방식을 알려주십시오.

사용자 이름을 생성하려면 임의 번호 생성에 대한 조언을 받아야하지만 은 한 번만 활동하기 때문에 나에게 적합합니다.

+0

더 나은 방법은 전자 메일 주소를 사용자 이름으로 사용하는 것입니다. [이전 질문] (http://stackoverflow.com/questions/16638414/set-email-as-username-in-django-1-5) 도움이 될 수 있습니다. [이 하나] (http://stackoverflow.com/questions/15597188/using-email-as-username-field-in-django-1-5-custom-user-model-results-in-fielder) 유용 할 수 있습니다. 너무. –

+0

그것의 의식적인 디자인 결정, 그것을하지 않기. – user1629366

+0

@ user1629366 사용자 이름에'str (idx)'를 추가하는 대신'email_1' 또는'email-1'과 같은 것을 사용할 수 있습니다. 'while' 루프를 사용하는 대신'_' 다음에 숫자를 얻을 수 있습니다 또는'-'을 사용하여 그것을 증가시키고 그것을 사용자 이름에 추가하십시오. 이것은 1000 명의 사용자가 동일한 사용자 이름 부분을 가지고 있다면 'while'루프가 1000 번 반복 할 것이기 때문에 도움이 될 것입니다. 왜냐하면 다른 유형의 사용자 이름을 사용하면 건너 뛸 수 있습니다. –

답변

0

내가 바꾸고 싶은 한 가지는 명시 적으로 첫 번째 except을 처리하는 것입니다. 당신이 사용하고 있기 때문에 :

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

그런 다음 MultipleObjectsReturned 예외를 발생시킬 수있는 현재 except 블록에 무한 루프를 만듭니다. 그럼 당신은 유사하게 두 번째 tryexcept 블록을 처리 할 수 ​​있습니다

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

하지만 그건 당신의 선택입니다 :

그래서 당신은 적어도 당신의 코드를 변경해야합니다.

희망이 도움이됩니다.

+0

내가 가지고있는 코드로 시작한다면, 하나의 이메일은 오직 한 명의 사용자에 해당하므로 동일한 전자 메일에 대해 여러 사용자가 반환되는 것에 대한 의문은 없습니다. – user1629366

+0

잘 질문은 일을 더 pythonic하는 방법이며, 당신이 잡으려는 예외를 잡아야한다.) –