2013-10-14 18 views
9

atar hatadır:get_or_create object.get_or_create() bütün mesele zaten, ben bu kodu için bir bütünlük hatası atıyor nedenini görmek için başarısız varsa nesneyi elde etmektir göz önüne alındığında Bütünlük Hata

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

herkes neler olduğunu biliyor musunuz?

+0

A Kullanıcı bu kullanıcı adıyla mevcut, ancak bu first_name, last_name veya email ile değil. –

cevap

20

parametreleri tam olarak eşleşmesi gerekir veya Django'nın ORM yeni bir nesne oluşturmak için çalışacağını söyledi ve bir birincil anahtar/benzersiz sütun kısıtlaması ihlal olacağını tarihi:

Sen yapmalıyım , hatayı alıyorsun.

bu deneyin:

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('/') 

Devamı get_or_create here üzerinde. defaults= argümanı, ihtiyacınız olan şeydir.

+0

Bir çekicilik gibi çalıştım. Teşekkürler! –

+0

Parolayı varsayılanlara koyamaz mısınız? –

+0

Hayır, çünkü 'set_password' şifreyi toplayıp veritabanına kaydeder. Bunu yapmanın doğru yolu budur. – karthikr

0

Dört koşullara dayalı bir kaydı almak için Django soruyorsunuz:

  • eposta
  • kullanıcı adı
  • first_name
  • last_name

Yani kombine dört alanları yok rekor. get_or_create yöntem haline gönderilen

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

Bu cevap yanlış. kayıt olmasaydı get_or_create onu yaratırdı. Get_or_create bunun için ve kullanıcı zaten kullanıyor. Benzersiz kısıtlama hatası nedeniyle IntegrityError gösterilir. –

+0

@VatsalJuneja Haklısınız. Teşekkürler! –

İlgili konular