2014-10-31 6 views
127

क्या यह दो आदेशों चल के बीच अंतर:Django मॉडल() बनाम Model.objects.create()

foo = FooModel() 

और

bar = BarModel.objects.create() 

दूसरा एक तुरंत बनाता है एक BarModel डेटाबेस में, जबकि FooModelsave() विधि को जोड़ने के लिए स्पष्ट रूप से कहा जाना चाहिए?

+18

हाँ, कि अंतर है –

उत्तर

113

https://docs.djangoproject.com/en/dev/topics/db/queries/#creating-objects

बना सकते हैं और एक ही चरण में एक वस्तु को बचाने, create() विधि का उपयोग करने।

+0

django दस्तावेज़ मेरी राय में इस बिंदु पर थोड़ा विरोधाभासी हैं। मेरे पास एक ही प्रश्न है और पढ़ें "ध्यान दें कि मॉडल को तुरंत चालू करने से आपके डेटाबेस को छूता है; इसके लिए, आपको() को सहेजने की आवश्यकता है। https://docs.djangoproject.com/en/1.10/ref/models/instances/#creating-objects – Nils

+0

मैं इसे विरोधाभासी के रूप में नहीं देखता हूं। आम तौर पर अजगर में, ऑब्जेक्ट्स नाम के बाद किसी क्रिएट विधि द्वारा ब्रैकेट डालने से आप ऑब्जेक्ट को तत्काल बनाते हैं – danidee

6

अद्यतन 2017/03/15:

मैं इस पर एक Django मुद्दा खोला है और यह प्रारंभिक यहाँ स्वीकार किए जाते हैं हो रहा है: https://code.djangoproject.com/ticket/27825

मेरा अनुभव यह है कि जब Constructor (ORM) का उपयोग Django 1.10.5 के संदर्भों से कक्षा में डेटा में कुछ असंगतता हो सकती है (यानी बनाए गए ऑब्जेक्ट के गुण ORM ऑब्जेक्ट प्रॉपर्टी के जाली प्रकार के बजाय इनपुट डेटा का प्रकार प्राप्त कर सकते हैं) उदाहरण:

models

class Payment(models.Model): 
    amount_cash = models.DecimalField() 

some_test.py - object.create

Class SomeTestCase: 
    def generate_orm_obj(self, _constructor, base_data=None, modifiers=None): 
     objs = [] 
     if not base_data: 
      base_data = {'amount_case': 123.00} 
     for modifier in modifiers: 
      actual_data = deepcopy(base_data) 
      actual_data.update(modifier) 
      # Hacky fix, 
      _obj = _constructor.objects.create(**actual_data) 
      print(type(_obj.amount_cash)) # Decimal 
      assert created 
      objs.append(_obj) 
     return objs 

some_test.py - Constructor()

Class SomeTestCase: 
    def generate_orm_obj(self, _constructor, base_data=None, modifiers=None): 
     objs = [] 
     if not base_data: 
      base_data = {'amount_case': 123.00} 
     for modifier in modifiers: 
      actual_data = deepcopy(base_data) 
      actual_data.update(modifier) 
      # Hacky fix, 
      _obj = _constructor(**actual_data) 
      print(type(_obj.amount_cash)) # Float 
      assert created 
      objs.append(_obj) 
     return objs 
3

दोनों वाक्यविन्यास बराबर नहीं हैं और यह अप्रत्याशित त्रुटियों हो सकता है। यहां अंतर दिखाने वाला एक साधारण उदाहरण है। आप एक मॉडल है:

from django.db import models 

class Test(models.Model): 

    added = models.DateTimeField(auto_now_add=True) 

और आप पहली बार एक वस्तु बनाने:

foo = Test.objects.create(pk=1) 

तो फिर तुम एक ही प्राथमिक कुंजी के साथ एक वस्तु बनाने की कोशिश:

foo_duplicate = Test.objects.create(pk=1) 
# returns the error: 
# django.db.utils.IntegrityError: (1062, "Duplicate entry '1' for key 'PRIMARY'") 

foo_duplicate = Test(pk=1).save() 
# returns the error: 
# django.db.utils.IntegrityError: (1048, "Column 'added' cannot be null")