它所運行的兩個命令的區別:Django的模型()與Model.objects.create()
foo = FooModel()
和
bar = BarModel.objects.create()
難道,第二個馬上創建一個BarModel
在數據庫,而對於FooModel
,save()
方法必須明確調用才能添加它?
它所運行的兩個命令的區別:Django的模型()與Model.objects.create()
foo = FooModel()
和
bar = BarModel.objects.create()
難道,第二個馬上創建一個BarModel
在數據庫,而對於FooModel
,save()
方法必須明確調用才能添加它?
https://docs.djangoproject.com/en/dev/topics/db/queries/#creating-objects
要創建並保存對象在單個步驟中,使用
create()
方法。
更新2017年3月15日:
我已經打開了這個Django的問題,這似乎是在這裏接受初步: https://code.djangoproject.com/ticket/27825
我的經驗是,使用Constructor
(ORM
)時類與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
兩個語法並不等同,它可能會導致意外的錯誤。 下面是一個簡單的例子,顯示了差異。 如果你有一個模型:
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")
是的,是區別。 – 2014-10-31 10:14:20