2013-10-14 2 views
9

यह देखते हुए कि object.get_or_create() के पूरे मुद्दे अगर यह पहले से मौजूद है, मैं क्यों यह इस कोड के लिए एक अखंडता त्रुटि फेंक को देखने के लिए असफल वस्तु प्राप्त करने के लिए है फेंकता त्रुटि है:get_or_create वफ़ादारी त्रुटि

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

कोई भी जानता है कि क्या हो रहा है?

+0

उपयोगकर्ता इस उपयोगकर्ता नाम के साथ मौजूद है, लेकिन इन first_name, last_name या ईमेल के साथ नहीं। –

उत्तर

20

get_or_create विधि में भेजा मानकों वास्तव में मैच के लिए की जरूरत है, या Django के ORM एक नई वस्तु बनाने की कोशिश करेगा, और के बाद से एक प्राथमिक कुंजी/अद्वितीय स्तंभ बाधा का उल्लंघन किया जाएगा , आपको त्रुटि मिल रही है। get_or_create here पर

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

और पढ़ें:

इस प्रयास करें। defaults= तर्क है जो आपको चाहिए था।

+0

एक आकर्षण की तरह काम किया। धन्यवाद! –

+0

क्या आप डिफ़ॉल्ट में पासवर्ड नहीं डाल सकते? –

+0

नहीं, क्योंकि 'set_password' पासवर्ड हैश और डेटाबेस में संग्रहीत करेगा। यह करने का सही तरीका है। – karthikr

0

आप Django पूछ रहे हैं चार शर्तों के आधार पर एक रिकार्ड लाने के लिए:

  • ईमेल
  • उपयोगकर्ता नाम
  • 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 के लिए है और उपयोगकर्ता पहले से ही इसका उपयोग कर रहा है। इंटीग्रिटी एरर अद्वितीय बाधा विफलता के कारण दिखाया गया है। –

+0

@ वत्सल जुनेजा आप सही हैं। धन्यवाद! –

संबंधित मुद्दे