Django Model()与Model.objects.create()的区别
Django Model()与Model.objects.create()的区别
运行以下两个命令有什么区别:
foo = FooModel()
和
bar = BarModel.objects.create()
第二个命令是否立即在数据库中创建BarModel
,而对于 FooModel
,必须显式调用save()
方法才能将它添加到数据库中?
Model()
和Model.objects.create()
之间的不同如下:
-
INSERT vs UPDATE
Model.save()
能够在数据库中插入或更新对象,而Model.objects.create()
仅能够进行插入操作。Model.save()
会执行以下操作:-
UPDATE 如果对象的主键属性被设置为一个等同于
True
的值 -
INSERT 如果对象的主键属性没有被设置,或者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()
-
使用
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()
-
使用
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
从物理改为数学,将max_marks
从100改为50),因为subject_id
是主键且subject_id=1
已经存在于数据库中。但是Subject.objects.create()
将引发IntegrityError
,因为主键subject_id
的值为1
已经存在。 -
-
强制插入
Model.save()
可以通过使用force_insert=True
参数使其行为类似于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
有关详细信息,请参见以下链接:
https://docs.djangoproject.com/en/stable/topics/db/queries/#creating-objects
要同时创建并保存对象,可以使用
create()
方法。