【问题标题】:difference between objects.create() and object.save() in django ormdjango orm中objects.create()和object.save()的区别
【发布时间】:2014-07-18 13:09:31
【问题描述】:
u = UserDetails.objects.create(first_name='jake',last_name='sullivan')
u.save()

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

类似问题:

【问题讨论】:

    标签: python django orm


    【解决方案1】:

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

    【讨论】:

    • 只是提醒大家,createsave都不要检查数据是否有效,你仍然需要调用full_clean
    【解决方案2】:

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

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


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

      Model.save() 执行 ....

      UPDATE → 如果对象的主键属性设置为评估为True的值

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


    1. 如果主键属性设置为一个值,则 Model.save() 执行 UPDATEModel.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命名Physics to数学和 max_marks 从 100 到 50,但 objects.create() raise IntegrityError


    1. Model.objects.create() 不等同于 Model.save() 但是可以通过 save 方法上的 force_insert=True 参数来实现相同的效果,即 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

    注意:以上答案来自question

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-23
      • 2019-07-07
      • 2012-05-18
      • 1970-01-01
      • 2017-05-10
      • 2018-06-25
      • 2016-04-06
      • 1970-01-01
      相关资源
      最近更新 更多