Django Model.objects.create vs Model.save()

jei2mxaa  于 2023-08-08  发布在  Go
关注(0)|答案(1)|浏览(128)

刚到Django ORM,有一个小问题。
如果我有一个像这样的模型:

class Person(models.Model):
  id = models.BigAutoField(primary_key=True)
  name = models.CharField(max_length=255)

字符串
我可以通过以下方式添加新的人员:

p1 = Person.objects.create(name="Bob")


或者是

p2 = Person(name="Bob")
p2.save()


在第一种情况下(p1),我可以预期设置了“id”字段(在插入完成时自动递增)。第二种情况下我能期待同样的结果吗?django是否更新内存中的“Person”对象的属性(在本例中是id字段)?
后续问题:
1.假设我有另一个模型

class Business(models.Model):
  id = models.BigAutoField(primary_key=True)
  owner = models.ForeignKey(Person)


如果我这么做有什么区别吗

b = Business(owner=p1)
b.save()


vs

b = Business(owner=p2)
b.save()


1.如果在将person对象传递到Business之前不保存或创建person对象,会发生什么?例如,在

p = Person(name="Bob")
b = Business(owner=p)
b.save()?

7d7tgy0s

7d7tgy0s1#

第二种情况下我能期待同样的结果吗?

,两者功能相同。第一个会更高效,因为它做了一个force_create,所以Django不会首先检查它是否可以在数据库中更新。

事实上,如果我们查看**.create(…)**方法[Django-doc]的实现[GitHub],我们会看到:

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

字符串
因此.create(…)将在内部调用.save(…)

相关问题