अगर मौजूद नहीं है तो बनाएं


81

मेरे पास एक Django एप्लिकेशन है जो वेब API से डेटा पढ़ता है और इसे डेटाबेस में रखता है।
क्या किसी मोड से एक नई वस्तु बनाने का एक तरीका है लेकिन यदि पहले से ही ऑब्जेक्ट मौजूद है तो डुप्लिकेट अपवाद को रोकें?

दूसरे शब्दों में, क्या किसी वस्तु को बचाने का एक तरीका है, लेकिन अगर यह पहले से मौजूद है तो बस कुछ नहीं करना है?

जवाबों:


161

9
डॉक्स के लिए एक लिंक बनाना कुछ चार्ट जोड़ता है (और यह एक बेहतर जवाब देता है मुझे लगता है)
दूसरा

4
यह 2 प्रश्न बनाने लगता है। अगर मैं केवल उस वस्तु को बचाना चाहता हूं, जो मौजूद नहीं है, तो क्या केवल 1 क्वेरी के साथ कोई रास्ता है? मैं अनुमान लगाता हूं कि IntegrityErrorवर्तमान लेनदेन के कारण गर्भपात हो सकता है और यह पर्याप्त नहीं है।
आमिर अली अकबरी

यदि आप एक savepoint, जैसे जोड़ने का उपयोग कर आप ईमानदारी त्रुटि पकड़ कर सकते हैं transaction.atomic(सुनिश्चित करें कि आप को पकड़ने बनाने के बाहरatomic ब्लॉक, यानी try: with acomic: create; except IntegrityErrorयह भी सुनिश्चित करें कि आप नहीं पकड़ बनाने के लिए मुश्किल है। अन्य की तुलना में अखंडता त्रुटियों आप करना चाहते हैं
दूसरे

यदि आप इसे पकड़ने में सक्षम हैं IntegrityError, तो मेरा परीक्षण दर्शाता है कि यह निष्पादन समय को लगभग आधा कर देता है जब रिकॉर्ड की तुलना में मौजूद होता है get_or_create()
रॉन


3

लगता है कि Django के नए संस्करणों में सेव () फ़ंक्शन डिफ़ॉल्ट रूप से एक अद्यतन या इन्सर्ट करता है। देखें यहाँ


ऐसा लगता है कि इसे स्वचालित रूप से अच्छी तरह से चुनना चाहिए, हालांकि मेरे डीबी में यह वर्तमान में प्रविष्टियों को दोहरा रहा है हर बार जब मैं डीबी को आबाद करने के लिए अपनी स्क्रिप्ट चलाता हूं।
मार्टिन-मार्टिन

सहेजें () विधि जाँचता है कि क्या मॉडल के पीके का मूल्य है। इस तकनीक का उपयोग करने के लिए सही पीके के साथ मॉडल का उदाहरण प्राप्त करने के लिए लेखक को DB को क्वेरी करना होगा। बचाने का एकमात्र उपयोग () जादू नहीं करता है।
चिनहून

0

इसका उपयोग करके प्राप्त किया जा सकता है Model.objects.get_or_create()

उदाहरण

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

किसी भी कीवर्ड तर्क (यहाँ first_name और last_name ) () get_or_create को पारित कर दिया - एक वैकल्पिक एक कहा जाता है को छोड़कर चूक - डेटाबेस में क्वेरी के लिए उपयोग किया जाएगा डेटाबेस में (वस्तु को ढूंढने)।

यह एक टपल लौटाता है, यदि कोई ऑब्जेक्ट मिलता है, तो get_or_create () उस ऑब्जेक्ट और फाल्स का एक टपल लौटाता है।

नोट : try exceptकथनों का उपयोग करके भी यही बात हासिल की जा सकती है
उदाहरण:

try:
    obj = Person.objects.get(first_name='John', last_name='Lennon')
except Person.DoesNotExist:
    obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9))
    obj.save()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.