更新 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_save
和 post_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/
我正在使用 Django 2.2 并且我有一个带有 auto_now
modification_datetime
字段的模型,我需要更新它 during/after 一个 bulk_update
执行仅针对受影响的真正更新的注册表。
是否可以通过 bulk_update
执行仅在受影响的记录上更新 auto_now
日期时间模型字段?
否,因为 bulk_update()
不会调用 save()
方法,也不会在实例上触发 pre_save
和 post_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/