运行两个命令之间的区别是什么:
foo = FooModel()
和
bar = BarModel.objects.create()
第二个是否立即在数据库中创建BarModel
,而对于FooModel
,是否必须显式调用save()
方法将其添加到数据库中?
答案 0 :(得分:190)
https://docs.djangoproject.com/en/dev/topics/db/queries/#creating-objects
要在一个步骤中创建和保存对象,请使用
create()
方法。
答案 1 :(得分:9)
这两种语法不相同,可能会导致意外错误。 这是一个显示差异的简单示例。 如果您有型号:
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")
答案 2 :(得分:8)
更新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
答案 3 :(得分:7)
Model()
与Model.objects.create()
之间的区别总结如下。
.save()
在内部作为db的 INSERT 或 UPDATE 对象内部执行,而.objects.create()
仅作为 INSERT 对象执行strong>指向数据库的对象。
Model.save()
执行 ....
更新→如果对象的主键属性设置为一个值,其值为True
插入→ 如果未设置对象的主键属性,或者UPDATE未更新任何内容(例如,如果主键设置为数据库中不存在的值)。
如果将主键属性设置为一个值,则Model.save()
执行 UPDATE ,但是Model.objects.create
引发IntegrityError
。
例如
models.py
class Subject(models.Model):
subject_id = models.PositiveIntegerField(primary_key=True, db_column='subject_id')
name = models.CharField(max_length=255)
max_marks = models.PositiveIntegerField()
1)使用Model.save()
physics = Subject(subject_id=1, name='Physics', max_marks=100)
physics.save()
math = Subject(subject_id=1, name='Math', max_marks=50) # Case of update
math.save()
输出:
Subject.objects.all().values()
<QuerySet [{'subject_id': 1, 'name': 'Math', 'max_marks': 50}]>
2)使用Model.objects.create()
Subject.objects.create(subject_id=1, name='Chemistry', max_marks=100)
IntegrityError: UNIQUE constraint failed: m****t.subject_id
说明:在math.save()
上方是更新的情况,因为subject_id
是主键,并且subject_id=1
存在django内部执行 UPDATE , 将物理名称命名为数学,并将max_marks从100更改为50 ,但是objects.create() raise IntegrityError
Model.objects.create()
不等同于Model.save()
,但是可以使用force_insert=True
方法(即save
)上的Model.save(force_insert=True)
参数来实现相同的目的。Model.save()
返回None
,其中Model.objects.create()
返回模型实例,即package_name.models.Model
结论:Model.objects.create()
在内部进行模型初始化,并对save
执行force_insert=True
。
Model.objects.create()的源代码块
def create(self, **kwargs):
"""
Create a new object with the given kwargs, saving it to the database
and returning the created object.
"""
obj = self.model(**kwargs)
self._for_write = True
obj.save(force_insert=True, using=self.db)
return obj
可以单击以下链接以获取更多详细信息: