Django / PostgreSQL:在更新时自动增加行的字段

时间:2018-03-09 21:13:16

标签: django postgresql

我想实现一个行版本号,每当更新一个表行时它会递增。

我正在使用PostgreSQL。

基本上我希望此字段的行为与以下updated_at时间戳字段类似: updated_at = models.DateTimeField(auto_now=True)

除了使用当前时间进行更新外,我想自动增加行的当前字段值。因此,如果该行有version=1并且我对该行进行了更新,则会将该行自动增加到version=2

我知道我可以通过覆盖模型save()方法来实现这一点,但我想知道是否有一种方法可以在数据库级别(最好是通过Django ORM)实现它,以便它适用于任何数据库访问脚本/查询。

1 个答案:

答案 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