2014-10-31 83 views
127

它所運行的兩個命令的區別:Django的模型()與Model.objects.create()

foo = FooModel() 

bar = BarModel.objects.create() 

難道,第二個馬上創建一個BarModel在數據庫,而對於FooModelsave()方法必須明確調用才能添加它?

+18

是的,是區別。 – 2014-10-31 10:14:20

回答

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 2017-01-27 12:50:40

+0

我不認爲這是矛盾的。通常在python中,您可以通過在對象名稱後面加上括號而不是通過create方法來實例化對象 – danidee 2017-03-24 18:10:26

6

更新2017年3月15日:

我已經打開了這個Django的問題,這似乎是在這裏接受初步: https://code.djangoproject.com/ticket/27825

我的經驗是,使用ConstructorORM)時類與Django 1.10.5的引用可能在數據中存在一些不一致(即,創建的對象的屬性可能會獲得輸入數據的類型而不是ORM對象屬性的轉換類型) 示例:

models

​​

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")