我想实现一个行版本号,每当更新一个表行时它会递增。
我正在使用PostgreSQL。
基本上我希望此字段的行为与以下updated_at
时间戳字段类似:
updated_at = models.DateTimeField(auto_now=True)
除了使用当前时间进行更新外,我想自动增加行的当前字段值。因此,如果该行有version=1
并且我对该行进行了更新,则会将该行自动增加到version=2
。
我知道我可以通过覆盖模型save()
方法来实现这一点,但我想知道是否有一种方法可以在数据库级别(最好是通过Django ORM)实现它,以便它适用于任何数据库访问脚本/查询。
答案 0 :(得分:1)
首先,您是否知道在执行models.DateTimeField(auto_now=True)
等操作时,YourModel.objects.filter().update(some_field=some_new_value)
这样的字段不会更新?对你好吗?
1)如果这是可以接受的,我会寻求这样的解决方案:
from django.db.models import F
from django.dispatch import receiver
from django.core.signals import post_save
@receiver(post_save, sender=YourModel)
def ensure_profile_exists(sender, instance, created, **kwargs):
sender.objects.filter(pk=instance.pk).update(version=F('version')+1)
您可以将该代码放在模型定义中。
2)如果您还需要处理.update()
更改,您应该去编写自定义postgres触发器(请参阅此处docs https://www.postgresql.org/docs/10/static/plpgsql-trigger.html)。创建后,可以使用虚假迁移在数据库中注册。见这里:https://stackoverflow.com/a/31698995/953553