2013-01-01 10 views
59

मैं व्यक्ति की तरह मॉडल मॉडल बनाना चाहता हूं, अगर व्यक्ति की आईडी मौजूद नहीं है, या मैं उस व्यक्ति वस्तु को प्राप्त करूंगा।मौजूद होने पर Django मॉडल या अद्यतन बनाएं

कोड निम्नलिखित के रूप में एक नया व्यक्ति बनाना:

class Person(models.Model): 
    identifier = models.CharField(max_length = 10) 
    name = models.CharField(max_length = 20) 
    objects = PersonManager() 

class PersonManager(models.Manager): 
    def create_person(self, identifier): 
     person = self.create(identifier = identifier) 
     return person 

लेकिन मैं जहां की जाँच करें और मौजूदा व्यक्ति वस्तु प्राप्त करने के लिए पता नहीं है।

उत्तर

111

आप के लिए देख रहे हैं "अद्यतन करता है, तो किसी और मौजूद है बनाने के" उपयोग के मामले में पहले से ही @Zags excellent answer


Django का संदर्भ लें एक get_or_create, https://docs.djangoproject.com/en/1.9/ref/models/querysets/#get-or-create

आप के लिए यह हो सकता है किया गया है:

id = 'some identifier' 
person, created = Person.objects.get_or_create(identifier=id) 

if created: 
    # means you have created a new person 
else: 
    # person just refers to the existing one 
+0

मैं Django 1.9 का उपयोग कर रहा है, और यह मुझे दे रहा है: AttributeError: 'क्वेरीसमूह' ऑब्जेक्ट कोई विशेषता 'update_or_create' –

+0

कि @OfekGila है अजीब, दोनों [स्रोत कोड] (है https://github.com/django /django/blob/master/django/db/models/query.py#L475) और [प्रलेखन] (https://docs.djangoproject.com/en/1.9/ref/models/querysets/#update-or- बनाएँ) 'QuerySet' की पुष्टि 'update_or_create' – bakkal

6

Django इस के लिए समर्थन हासिल है, जाँच get_or_create

person, created = Person.objects.get_or_create(name='abc') 
if created: 
    # A new person object created 
else: 
    # person object already exists 
3

सोचा था कि मैं एक प्रश्न जोड़ूंगा क्योंकि आपका प्रश्न शीर्षक ऐसा लगता है कि प्रश्नपत्र में वर्णित या प्राप्त करने के बजाय यह कैसे बनाना या अपडेट करना है।

आप बना सकते हैं या एक वस्तु, .save() विधि को पहले से ही, डिफ़ॉल्ट रूप से इस व्यवहार है the docs से अद्यतन करना चाहते थे:

Django abstracts the need to use INSERT or UPDATE SQL statements. Specifically, when you call save(), Django follows this algorithm:

If the object’s primary key attribute is set to a value that evaluates to True (i.e., a value other than None or the empty string), Django executes an UPDATE. If the object’s primary key attribute is not set or if the UPDATE didn’t update anything, Django executes an INSERT.

यह ध्यान देने योग्य है कि जब वे कहते हैं 'यदि अद्यतन didn 'कुछ भी अपडेट नहीं करें' वे अनिवार्य रूप से उस मामले का जिक्र कर रहे हैं जहां आपने ऑब्जेक्ट दिया था आईडी डेटाबेस में पहले से मौजूद नहीं है।

73

यह स्पष्ट नहीं है कि आपका प्रश्न get_or_create विधि (कम से कम Django 1.3 से उपलब्ध) या update_or_create विधि (Django 1.7 में नया) के लिए पूछ रहा है या नहीं। यह इस बात पर निर्भर करता है कि आप उपयोगकर्ता ऑब्जेक्ट को कैसे अपडेट करना चाहते हैं।

# In both cases, the call will get a person object with matching 
# identifier or create one if none exists; if a person is created, 
# it will be created with name equal to the value in `name`. 

# In this case, if the Person already exists, its existing name is preserved 
person, created = Person.objects.get_or_create(
     identifier=identifier, defaults={"name": name} 
) 

# In this case, if the Person already exists, its name is updated 
person, created = Person.objects.update_or_create(
     identifier=identifier, defaults={"name": name} 
) 
+5

+1' update_or_create' के लिए है क्योंकि उस उपयोग के मामले में यह ऑब्जेक्ट पर फिर से 'save()' को कॉल करने के लिए 'get_or_create' से बेहतर है। – bakkal

0

इनपुट जब आप बनाने के एक प्राथमिक कुंजी है में से एक हैं, तो यह पर्याप्त होगा::

नमूना उपयोग इस प्रकार है

Person.objects.get_or_create(id=1) 

यह स्वचालित रूप से अगर दो के बाद से अस्तित्व में अपडेट हो जाएगा उसी प्राथमिक कुंजी वाले डेटा की अनुमति नहीं है।

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