django orm中objects.create()和object.save()之间的区别

jac*_*uel 42 python django orm

u = UserDetails.objects.create(first_name='jake',last_name='sullivan')
u.save()
Run Code Online (Sandbox Code Playgroud)

UserDetails.objects.create()并且u.save()都执行相同的save()功能.有什么不同?使用create()vs 有任何额外的检查或好处save()吗?

类似的问题:
- 在Django中创建模型对象的最佳方法是什么?
- Django:从事务角度看save()和create()之间的区别

Max*_*ant 63

Django文档说它是一样的.这仅仅是更方便,使其在同一行.你也可以save()在一行上创建,但它会更冗长,更不易读 - 很明显你用这个create()方法创建了一个新对象.

create(**kwargs)

创建对象并将其全部保存在一个步骤中的便捷方法.从而:

p = Person.objects.create(first_name="Bruce", last_name="Springsteen")
Run Code Online (Sandbox Code Playgroud)

和:

p = Person(first_name="Bruce", last_name="Springsteen")
p.save(force_insert=True)
Run Code Online (Sandbox Code Playgroud)

是等价的.

force_insert参数在别处记录,但它的全部意思是始终会创建一个新对象.通常你不需要担心这个.但是,如果您的模型包含您设置的手动主键值,并且该值已存在于数据库中,则调用create()将失败,IntegrityError因为主键必须是唯一的.如果您使用手动主键,请准备好处理异常.

  • 提醒大家一下,create和save都不会检查数据是否有效,你仍然需要调用full_clean。 (5认同)

小智 7

类似问题: Django Model() vs Model.objects.create()

Model()vs之间的区别Model.objects.create()总结如下。


  1. .save()在内部作为INSERTUPDATE对象.objects.create()执行到 db,而仅对db执行INSERT对象。

    Model.save() 执行....

    更新?如果对象的主键属性设置为评估为True

    插入?如果对象的主键属性未设置或 UPDATE 未更新任何内容(例如,如果主键设置为数据库中不存在的值)。


  1. 如果主键属性设置为一个值,则Model.save()执行UPDATEModel.objects.createraise IntegrityError

    例如。

    模型.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()
    
    Run Code Online (Sandbox Code Playgroud)

    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()
    
    Run Code Online (Sandbox Code Playgroud)

    输出:

    Subject.objects.all().values()
    <QuerySet [{'subject_id': 1, 'name': 'Math', 'max_marks': 50}]>
    
    Run Code Online (Sandbox Code Playgroud)

    2)插入数据库 Model.objects.create()

    Subject.objects.create(subject_id=1, name='Chemistry', max_marks=100)
    IntegrityError: UNIQUE constraint failed: m****t.subject_id
    
    Run Code Online (Sandbox Code Playgroud)

    说明:以上math.save()是更新的情况,因为它subject_id是主键并且subject_id=1存在 django 内部执行UPDATE为此将 Physics 命名为 Math 和 max_marks 从 100 到 50,但是objects.create() raise IntegrityError


  1. Model.objects.create()不等同于,Model.save()但是可以通过方法 ie上的force_insert=True参数实现相同的效果。saveModel.save(force_insert=True)

  1. Model.save()返回NonewhereModel.objects.create()返回模型实例即package_name.models.Model

结论:在 Model.objects.create()内部进行模型初始化并save使用force_insert=True.

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
Run Code Online (Sandbox Code Playgroud)

可以通过以下链接了解更多详细信息:

  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

注意:以上答案来自问题