Answers:
https://docs.djangoproject.com/zh-CN/stable/topics/db/queries/#creating-objects
要在一个步骤中创建和保存对象,请使用
create()
方法。
两种语法不等效,并且可能导致意外错误。这是一个显示差异的简单示例。如果您有模型:
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")
.create()
即使null=False
缺少必填字段()也会创建一个对象?我正在为项目添加测试,但create
结果出乎意料
CharField
即使null=False
未设置为,如果未提供也不会引发错误:这是因为Django默认将字符串设置为空字符串,""
因此从技术上讲不是这样null
obj = MyModel()
,obj.full_clean()
。
更新15.3.2017:
我已经对此打开了Django问题,似乎已经在这里被初步接受:https : //code.djangoproject.com/ticket/27825
我的经验是,当通过Django 在引用中使用Constructor
(ORM
)类时,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