更新 bulk_update 中的 auto_now 字段

Update auto_now field in bulk_update

我正在使用 Django 2.2 并且我有一个带有 auto_now modification_datetime 字段的模型,我需要更新它 during/after 一个 bulk_update 执行仅针对受影响的真正更新的注册表。

是否可以通过 bulk_update 执行仅在受影响的记录上更新 auto_now 日期时间模型字段?

否,因为 bulk_update() 不会调用 save() 方法,也不会在实例上触发 pre_savepost_save 信号(通常只生成单个更新查询)。通常也没有回忆在 Django 中实际更新的实例

此外,如记录的那样,auto_now 不会在 update()/bulk_update() 上触发,因为它是由 save()

触发的

The field is only automatically updated when calling Model.save(). The field isn’t updated when making updates to other fields in other ways such as QuerySet.update(), though you can specify a custom value for the field in an update like that.

您可以检查哪些实例已手动更新并更新它们的时间戳或执行某种数据库触发器

也许在 QuerySet 中覆盖您的更新方法会有所帮助。但我不确定这是否只更新“updated_at”在批量更新中真正改变的数据。

from django.db import models
from django.utils import timezone

class YourModelQuerySet(models.QuerySet):

    def update(self, **kwargs):
        kwargs['updated_at'] = timezone.now()
        super().update(**kwargs)

class YourModel(models.Model):
    objects = YourModelQuerySet.as_manager()

    updated_at = models.DateTimeField()
    other_fields = ...

编辑:

也看这里:https://brobin.me/blog/2020/02/auto-updated-timestamp-fields-in-django-bulk-querysets/