运行两个命令有什么区别:
foo = FooModel()
和
bar = BarModel.objects.create()
第二种方法是否会立即在数据库中创建一个BarModel
,而对于FooModel
,必须显式调用save()
方法才能将其添加到数据库中?
运行两个命令有什么区别:
foo = FooModel()
和
bar = BarModel.objects.create()
第二种方法是否会立即在数据库中创建一个BarModel
,而对于FooModel
,必须显式调用save()
方法才能将其添加到数据库中?
https://docs.djangoproject.com/en/stable/topics/db/queries/#creating-objects
使用create()
方法可以在一个步骤中创建并保存对象。Ctrl+F
... 顺便说一句,不要点赞它,我是认真的,伙计们 - 只需阅读那些令人惊叹的文档 :) 和平! - madzohanModel()
和 Model.objects.create()
之间的区别如下:
INSERT vs UPDATE
Model.save()
可以将对象插入或更新到数据库中,而 Model.objects.create()
只能插入新的对象。
Model.save()
的行为如下:
更新 若对象的主键属性设置为一个等价于 True
的值。
插入 若对象的主键属性未设置或者如果更新操作没有更新任何内容(例如,主键设置为数据库中不存在的值)。
已经存在的主键
如果将主键属性设置为一个已经存在的值,那么 Model.save()
将执行更新操作,但是 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()
使用 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}]>
使用Model.objects.create()
将数据插入到数据库中
Subject.objects.create(subject_id=1, name='Chemistry', max_marks=100)
IntegrityError: UNIQUE constraint failed: m****t.subject_id
解释: 在这个例子中,math.save()
执行了一个 UPDATE(将 name
从 Physics 更改为 Math,将 max_marks
从 100 更改为 50),因为 subject_id
是主键且 subject_id=1
已经存在于数据库中。但是,Subject.objects.create()
抛出了 IntegrityError
,因为再次使用值为 1
的主键 subject_id
已经存在。
强制插入
可以通过使用 force_insert=True
参数,使 Model.save()
表现得像 Model.objects.create()
: Model.save(force_insert=True)
。
返回值
Model.save()
返回 None
,而 Model.objects.create()
返回模型实例,即 package_name.models.Model
结论: Model.objects.create()
进行模型初始化并使用 force_insert=True
执行 save()
。
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
查看更多详细信息,请点击以下链接:
这两种语法不等同,会导致意外错误。以下是一个简单的示例,展示了它们之间的差异。
如果你有一个模型:
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
的结果出乎意料。 - Vaibhav VishalCharField
设为null=False
,如果没有提供值,它也不会引发错误:这是因为Django默认将字符串设置为空字符串"",因此在技术上它不是null
。 - Thomas Leonardobj = MyModel()
,然后obj.full_clean()
。 - Vaibhav Vishal更新于2017年3月15日:
我在Django问题跟踪中提出了这个问题,并且似乎初步已被接受: https://code.djangoproject.com/ticket/27825
我的经验是,在使用Django 1.10.5
的Constructor
(ORM
)类通过引用时,数据可能存在一些不一致性。(例如:创建的对象的属性可能会获取输入数据的类型而不是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
Model.objects.create()
创建一个模型实例并将其保存。 Model()
只是在内存中创建了一个模型实例,只有在调用该实例的save()
方法保存时才会将其保存到数据库中。此时还会进行验证。
.save()
。如果您想要说什么,请发布一个链接,该链接指向简短的代码示例,而不是10页的文本。为什么您要毫无根据地让其他人感到不确定呢? - mirek