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

时间:2014-05-29 05:37:18

标签: python django orm

u = UserDetails.objects.create(first_name='jake',last_name='sullivan')
u.save()

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

类似的问题:
- What's the best way to create a model object in Django?
- Django: Difference between save() and create() from transaction perspective

2 个答案:

答案 0 :(得分:52)

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而失败   主键必须是唯一的。准备好处理异常,如果   您正在使用手动主键。

答案 1 :(得分:4)

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

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


  1. .save()在内部作为db的 INSERT UPDATE 对象内部执行,而.objects.create()仅作为 INSERT 对象执行strong>指向数据库的对象。

    Model.save()执行 ....

    更新→如果对象的主键属性设置为一个值,其值为True

    插入→ 如果未设置对象的主键属性,或者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()
    <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 将物理名称命名为数学,并将max_marks从100更改为50 ,但是objects.create() raise IntegrityError


  1. Model.objects.create()不等同于Model.save(),但是可以使用force_insert=True方法(即save)上的Model.save(force_insert=True)参数来实现相同的目的。

  1. Model.save()返回None,其中Model.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

可以单击以下链接以获取更多详细信息:

  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

注意:以上答案来自question