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

问题描述 投票:0回答:3
u = UserDetails.objects.create(first_name='jake',last_name='sullivan')
u.save()

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

类似问题:

python django orm
3个回答
104
投票

Django 文档说它是相同的。只是在一条线上完成它更方便。您也可以在一行上创建

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


17
投票

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

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


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

    Model.save()
    执行....

    UPDATE → 如果对象的主键属性设置为计算结果为

    True

    的值

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


  1. 如果主键属性设置为一个值,则

    Model.save()
    执行 UPDATE
    Model.objects.create
    提高
    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()
    

    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

注意:以上答案来自问题


0
投票

我对此的想法是,您应该在创建新的 User 对象时使用 user=User.objects.create(name=name, location=location) ,并在修改用户对象时使用 user.save() 的实例.

© www.soinside.com 2019 - 2024. All rights reserved.