Get_or_create का उपयोग करने का सही तरीका


203

मैं अपने रूपों में कुछ क्षेत्रों के लिए get_or_create का उपयोग करने की कोशिश कर रहा हूं, लेकिन जब मैं ऐसा करने की कोशिश करता हूं तो मुझे 500 त्रुटि मिल रही है।

लाइनों में से एक इस तरह दिखता है:

customer.source = Source.objects.get_or_create(name="Website")

उपरोक्त कोड के लिए मुझे त्रुटि है:

Cannot assign "(<Source: Website>, False)": "Customer.source" 
   must be a "Source" instance.

जवाबों:


353

दस्तावेज़ से get_or_create :

# get_or_create() a person with similar first names.

p, created = Person.objects.get_or_create(
    first_name='John',
    last_name='Lennon',
    defaults={'birthday': date(1940, 10, 9)},
)

# get_or_create() didn't have to create an object.
>>> created
False

व्याख्या: समानता के लिए मूल्यांकन किए जाने वाले क्षेत्रों, बाहर उल्लेख किया जाना है defaults। बाकी क्षेत्रों को इसमें शामिल किया जाना हैdefaults । क्रिएट घटना होने पर, सभी फ़ील्ड्स को ध्यान में रखा जाता है।

ऐसा लगता है कि आपको एक एकल चर के बजाय एक टपल में लौटने की आवश्यकता है, इस तरह करें:

customer.source,created = Source.objects.get_or_create(name="Website")

3
FYI करें एक बूलियन है। अगर बनाया गया है तो सच है, अगर यह गलत है
जोश

3
एक अतिरिक्त save()अतिरेक है?
जिप्रो

@zypro यह की तरह है create(), वस्तु बना सकते हैं और यह एक ही चरण में बचाने के लिए और किसी भी जरूरत नहीं हैsave()
अमीन मीर

32

get_or_create टपल देता है।

customer.source, created = Source.objects.get_or_create(name="Website")

16
या, यदि आप बूलियन ध्वज के बारे में परवाह नहीं करते हैं:customer.source = Source.objects.get_or_create(name="Website")[0]
mipadi

7
@mipadi मैं पसंद करूंगा customer.source, _ = Source.objects.get_or_create(name="Website"), क्योंकि यह इस तथ्य को बनाता है कि भविष्य के कीड़े से बचने में मदद करने के लिए एक टपल अधिक स्पष्ट रूप से वापस आ गया था।
सुलैमान यूको

15

get_or_create() एक वापसी देता है:

customer.source, created  = Source.objects.get_or_create(name="Website")
  • created एक बूलियन मान है, बनाया गया है या नहीं।

  • customer.source get_or_create() विधि का एक उद्देश्य है ।


12

@Tobu उत्तर और @mipadi टिप्पणी के बाद, और अधिक pythonic तरीके से, यदि निर्मित ध्वज में कोई दिलचस्पी नहीं है, तो मैं उपयोग करूंगा:

customer.source, _ = Source.objects.get_or_create(name="Website")

4

आप जिस समस्या का सामना कर रहे हैं वह एक प्रलेखित विशेषता है get_or_create

"डिफॉल्ट" के अलावा अन्य कीवर्ड के तर्कों का उपयोग करते समय का रिटर्न मान get_or_createएक उदाहरण है। इसलिए यह आपको रिटर्न वैल्यू में पार्न्स दिखा रहा है।

आप customer.source = Source.objects.get_or_create(name="Website")[0]सही मूल्य प्राप्त करने के लिए उपयोग कर सकते हैं ।

यहाँ प्रलेखन के लिए एक लिंक है: http://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create-kwargs

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.