Django Model()与Model.objects.create()的区别

30 浏览
0 Comments

Django Model()与Model.objects.create()的区别

运行以下两个命令有什么区别:

foo = FooModel()

bar = BarModel.objects.create()

第二个命令是否立即在数据库中创建BarModel,而对于 FooModel,必须显式调用save() 方法才能将它添加到数据库中?

admin 更改状态以发布 2023年5月21日
0
0 Comments

Model()Model.objects.create()之间的不同如下:


  1. INSERT vs UPDATE

    Model.save()能够在数据库中插入或更新对象,而Model.objects.create()仅能够进行插入操作。

    Model.save()会执行以下操作:

    • UPDATE 如果对象的主键属性被设置为一个等同于 True 的值

    • INSERT 如果对象的主键属性没有被设置,或者UPDATE没有更新任何内容(例如如果主键被设置为一个不存在于数据库中的值)。


  1. 现有的主键

    如果主键属性被设置为一个值并且此主键已经存在,则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()
      
      

    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()执行UPDATE操作(将name从物理改为数学,将max_marks从100改为50),因为subject_id是主键且subject_id=1已经存在于数据库中。但是Subject.objects.create()将引发IntegrityError,因为主键subject_id的值为1已经存在。


  1. 强制插入

    Model.save()可以通过使用force_insert=True参数使其行为类似于Model.objects.create()Model.save(force_insert=True)


  1. 返回值

    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

有关详细信息,请参见以下链接:

  1. https://docs.djangoproject.com/en/stable/ref/models/querysets/#create

  2. https://github.com/django/django/blob/2d8dcba03aae200aaa103ec1e69f0a0038ec2f85/django/db/models/query.py#L440

0
0 Comments

https://docs.djangoproject.com/en/stable/topics/db/queries/#creating-objects

要同时创建并保存对象,可以使用 create() 方法。

0