【问题标题】:Django .update doesn't call override save?Django .update 不调用覆盖保存?
【发布时间】:2015-11-20 00:22:15
【问题描述】:

我正在尝试在模型中调用此覆盖保存方法:

def save(self, *args, **kwargs):
    if self.done is True:
        if self.averagepa is None:
            pass
        elif self.averagepa < 26:
            self.links = 5
        elif self.averagepa < 31:
            self.links = 10
        elif self.averagepa < 36:
            self.links = 15
        elif self.averagepa < 41:
            self.links = 20
        else:
            self.links = 99
super(KW, self).save(*args, **kwargs)

如果我只是将模型保存在管理面板中,这将非常有效。但是当我尝试像这样通过./manage.py shell 更新它时:

KW.objects.filter(id=138).update()

它不会触发它。如何通过 shell 更新调用保存覆盖方法?

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    这是update() 方法的documented behaviour

    请注意,update() 方法会直接转换为 SQL 语句。这是直接更新的批量操作。它不会在您的模型上运行任何 save() 方法,也不会发出 pre_save 或 post_save 信号(这是调用 save() 的结果),或支持 auto_now 字段选项。如果您想保存 QuerySet 中的每个项目并确保在每个实例上调用 save() 方法,则不需要任何特殊函数来处理它。只需遍历它们并致电save()

    在你的情况下:

    kw = KW.objects.get(id=138)
    # update kw
    kw.save()
    

    【讨论】:

    • @SanthoshYedidi 要么更改您的代码以使用上述save(),要么自己更新该字段,例如queryset.update(updated_at=timezone.now(), ...)
    • 但是循环多个对象以使用 save() 会比 queryset.update 有性能劣势。由于查询的数量
    • 如果您的情况是性能问题,请自行更新该字段。
    猜你喜欢
    • 2011-08-17
    • 2018-10-07
    • 2015-08-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    相关资源
    最近更新 更多