运行两个命令有什么区别:
foo = FooModel()
和
bar = BarModel.objects.create()
第二个方法是否立即在数据库中创建BarModel
,而对于FooModel
,必须显式调用save()
方法才能将其添加到数据库中?
发布于 2017-10-04 17:42:02
这两种语法不等价,可能会导致意外错误。这里有一个简单的例子来说明不同之处。如果你有一个模型:
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")
发布于 2017-02-09 23:46:47
更新15.3.2017:
我已经在这个问题上打开了一个Django问题,它似乎在这里被初步接受:https://code.djangoproject.com/ticket/27825
我的经验是,当通过引用在Django 1.10.5
中使用Constructor
(ORM
)类时,数据中可能会有一些不一致(例如,创建的对象的属性可能会获得输入数据的类型,而不是1.10.5
对象属性的强制转换类型)示例:
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
发布于 2021-11-21 20:04:15
Model.objects.create()
创建一个模型实例并保存它。Model()
仅创建内存中的模型实例。直到您调用实例的save()
方法来保存它,它才会保存到数据库中。这也是验证发生的时候。
https://stackoverflow.com/questions/26672077
复制相似问题