【问题标题】:question about save(update_fields) method nuances , Django关于 save(update_fields) 方法细微差别的问题,Django
【发布时间】:2019-09-30 14:13:10
【问题描述】:

快速提问。无法在文档中找到它,或者存在相互矛盾的信息。

方法:

save(update_fields = somefields)

工作原理与方法相同:

SomeModel.objects.update(somefields here)

就这两种方法都在数据库级别工作而不触发模型中的 SAVE 方法而言?

UPDATE 适用于数据库级别,这很清楚

save(update_fields = somefields) 呢???

谢谢你,对相当抽象的问题感到抱歉


    def delete(self, using=None, keep_parents=False):
        self.show = False
        self.change_date = datetime.datetime.now()
        self.save(update_fields=["show", "change_date"]) # will it trigger save() method in the model or not???

【问题讨论】:

  • 特别注意使用任何延迟字段获取实例时会发生什么。 Model.save 做了一些有用但不如Manager.update 明显的棘手事情。虽然不完全是同一个问题,this SO answer 有很多有用的信息。
  • 调用save 方法会触发save 方法。并且update_fields 参数被传递给pre_savepost_save 信号。无论您以何种方式调用save,它都会以save_base 结尾。 self.save(...) ... will it trigger save() method in the model 触发save方法的代码,不是吗?
  • 在 django 文档中说:“指定 update_fields 将强制更新”。这不清楚.. 在这种情况下它会使用 Manager.update() 还是只是标准的 save() 但具有有限的字段集?问题是带有 auto_add 的 datetimefield 不适用于 save(update_fields)。我只是认为这是因为 update_fields 在数据库级别上工作,在这种情况下,没有任何信号可能会以某种方式触发 auto_add。只是猜测
  • 最后是更新还是插入。有一个force_update 选项。但是,当 update_fields 被传递时 - 将强制更新

标签: django django-queryset django-orm


【解决方案1】:

虽然使用 save(update_fields=[.....]) 强制在 db 级别进行更新查询,但它比 update() 方法慢,因为在此之前额外调用了 super.save()。

super.save(*args, **kwargs)

不要使用带有 update_fields 的保存,而是尝试使用类似的东西。

YourModel.objects.filter(pk=self.pk).update(show=False, change_date=datetime.datetime.now())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-23
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多