【问题标题】:Update creation and update time pragmatically vs via database trigger实用地更新创建和更新时间与通过数据库触发器
【发布时间】:2025-12-16 22:40:01
【问题描述】:

我想在我的 django 应用中为多个模型添加创建和更新时间戳。我想知道最佳做法是什么?

我发现可以使用auto_nowauto_now_add 来完成(或者最好通过自定义save() 方法)。我称之为程序化方式。

想到的另一种方法是定义一个触发器函数并将其分配给数据库级别的多个数据库表(postgresql)。

那么做这样的事情的最佳做法是什么? (这可能包括总价格计算和使用其他列数据计算的任何其他列信息)。触发器还是代码?

注意

这可能是一个基于意见的问题。如果是这样,请在评论中告诉我,我会在听到有经验的开发人员的一两个意见后删除问题。

【问题讨论】:

  • 当有人通过您的应用程序以外的其他方式更新数据库时,您是否有兴趣记录?如果是,您将需要一个触发器。

标签: python sql django postgresql django-rest-framework


【解决方案1】:

使用 django 信号也许是一种解决方案。
它喜欢数据库中的触发器;
https://docs.djangoproject.com/en/3.1/topics/signals/

我是这样使用的:

from django.dispatch.dispatcher import receiver
from django.db.models.signals import post_save
from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    is_validated = models.BooleanField(default=False)

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)


@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

【讨论】: