django orm中objects.create()和object.save()的区别
Posted
技术标签:
【中文标题】django orm中objects.create()和object.save()的区别【英文标题】:difference between objects.create() and object.save() in django orm 【发布时间】:2014-07-18 13:09:31 【问题描述】:u = UserDetails.objects.create(first_name='jake',last_name='sullivan')
u.save()
UserDetails.objects.create()
和 u.save()
都执行相同的 save()
功能。有什么区别?使用create()
与save()
有什么额外的检查或好处吗?
类似问题:
What's the best way to create a model object in Django? Django: Difference between save() and create() from transaction perspective Django Model() vs Model.objects.create()【问题讨论】:
【参考方案1】:The Django documentation says it is the same。把它放在一条线上只是更方便。您也可以在一行上创建一个save()
,但它会更冗长且可读性较差——很明显,您正在使用create()
方法创建一个新对象。
create(**kwargs)
一种创建对象并将其全部保存在一个中的便捷方法 步。因此:
p = Person.objects.create(first_name="Bruce", last_name="Springsteen")
和:
p = Person(first_name="Bruce", last_name="Springsteen") p.save(force_insert=True)
是等价的。
force_insert
参数记录在其他地方,但这意味着 是总是会创建一个新对象。通常你不需要 担心这个。但是,如果您的模型包含手动主 您设置的键值以及该值是否已存在于 数据库,对create()
的调用将失败并返回IntegrityError
,因为 主键必须是唯一的。准备好处理异常,如果 您正在使用手动主键。
【讨论】:
只是提醒大家,create
和save
都不要检查数据是否有效,你仍然需要调用full_clean
。【参考方案2】:
类似的问题: Django Model() vs Model.objects.create()
Model()
与Model.objects.create()
的区别总结如下。
.save()
在内部作为 INSERT 或 UPDATE 对象执行 db,而 .objects.create()
仅执行 INSERT 对象到 db。
Model.save()
执行 ....
UPDATE → 如果对象的主键属性设置为评估为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,命名Physics to数学和 max_marks 从 100 到 50,但 objects.create() raise IntegrityError
Model.objects.create()
不等同于 Model.save()
但是可以通过 save
方法上的 force_insert=True
参数来实现相同的效果,即 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
更多详情可点击以下链接:
https://docs.djangoproject.com/en/stable/ref/models/querysets/#create
https://github.com/django/django/blob/2d8dcba03aae200aaa103ec1e69f0a0038ec2f85/django/db/models/query.py#L440
注意:以上答案来自question。
【讨论】:
以上是关于django orm中objects.create()和object.save()的区别的主要内容,如果未能解决你的问题,请参考以下文章