【问题标题】:Django / PostgreSQL: auto-increment a row's field on updateDjango / PostgreSQL:更新时自动增加行的字段
【发布时间】:2018-08-18 12:36:41
【问题描述】:

我想实现一个行版本号,该版本号在表行更新时递增。

我正在使用 PostgreSQL。

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

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

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

【问题讨论】:

  • 您几乎可以在每个数据库中编写更新触发器。它不涉及 Django。
  • 你知道像models.DateTimeField(auto_now=True)这样的字段在执行YourModel.objects.filter().update(some_field=some_new_value)这样的操作时不会被更新吗?你还好吗?

标签: django postgresql


【解决方案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 触发器(请参阅此处的文档 https://www.postgresql.org/docs/10/static/plpgsql-trigger.html)。创建后,可以使用假迁移将其注册到数据库中。见这里:https://stackoverflow.com/a/31698995/953553

【讨论】:

  • 太棒了。我不知道update 函数。很高兴知道。我认为使用 SQL 编写迁移可能是一个成功的解决方案。你知道这种触发器是否也可以在我在 dev 中使用的 SQLite DB 上工作?
  • 您需要在迁移中区分它应该应用的后端,并为每个后端选择正确的触发代码
猜你喜欢
  • 2012-03-09
  • 2016-12-24
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多