2013-10-14 3 views
9

Учитывая, что весь смысл object.get_or_create(), чтобы получить объект, если он уже существует, я не понимаю, почему он бросает ошибку целостности для этого кода:get_or_create бросков Integrity Ошибка

class UserAdd(TemplateView): 

def post(self, request, *args, **kwargs): 
    context = self.get_context_data(*args, **kwargs) 
    form = UserAddForm(request.POST) 
    if form.is_valid(): 
     first_name = form.cleaned_data['first_name'] 
     last_name = form.cleaned_data['last_name'] 
     myemail = form.cleaned_data['email'] 
     mypass = form.cleaned_data['password'] 
     if myemail and mypass: 
      myuser,created = User.objects.get_or_create(email=myemail, username=myemail, first_name=first_name, last_name=last_name) 
      if created: 
       myuser.set_password(mypass) 
    return HttpResponseRedirect('/') 

Здесь это ошибка:

django.db.utils.IntegrityError IntegrityError: (1062, "Duplicate entry '[email protected]' for key 'username_UNIQUE'") 

Кто-нибудь знает, что происходит?

+0

Пользователь существует с этим именем пользователя, но не с этими first_name, last_name или электронной почтой. –

ответ

20

Параметры, посылаемые в метод get_or_create должны точно соответствовать, или ОРМ Джанго будет пытаться создать новый объект, а так как первичный ключ/ограничение уникальности столбец будет нарушен , вы получаете ошибку.

Попробуйте это:

if form.is_valid(): 
    first_name = form.cleaned_data['first_name'] 
    last_name = form.cleaned_data['last_name'] 
    myemail = form.cleaned_data['email'] 
    mypass = form.cleaned_data['password'] 
    if myemail and mypass: 
     myuser,created = User.objects.get_or_create(email=myemail, defaults = {'username': myemail, 'first_name': first_name, 'last_name': last_name}) 
     if created: 
      myuser.set_password(mypass) 

return HttpResponseRedirect('/') 

Подробнее о get_or_create here. Аргумент defaults= - это то, что вам нужно.

+0

Работал как шарм. Благодаря! –

+0

Не можете ли вы поместить пароль по умолчанию? –

+0

нет, потому что 'set_password' будет хэш-пароль и сохранить его в базе данных. Это правильный способ сделать это. – karthikr

0

Вы спрашиваете Джанго принести запись на основе четырех условий:

  • электронной
  • имя пользователя
  • first_name
  • last_name

Таким образом, все четыре поля в сочетании не имеет запись.

Вы должны сделать:

myuser, created = User.objects.get_or_create(
    username=myemail, defaults={'first_name': first_name, 'last_name': last_name, 'email': myemail}) 
+0

Этот ответ неверен. если бы не было записи, get_or_create бы ее создал. Для этого используется get_or_create, и пользователь уже использует его. IntegrityError показан из-за уникального сбоя ограничения. –

+0

@ VatsalJuneja Вы правы. Благодаря! –

Смежные вопросы