You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更新关联模型的时间戳?Django模型时间戳同步需求

嘿,要实现当Entry更新时同步更新关联Blog的last_changed时间戳,用Django的信号机制就很合适,这也是处理这类跨模型联动的常规操作。我给你详细说下怎么做:

实现方案:监听Entry的post_save信号

Django的post_save信号会在模型实例完成保存(创建或更新)后触发,我们可以借助它来触发Blog的时间戳更新逻辑。

步骤1:编写信号处理函数

在你的Django应用目录下创建signals.py文件(如果还没有的话),添加以下代码:

from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Entry

@receiver(post_save, sender=Entry)
def sync_blog_last_changed(sender, instance, created, **kwargs):
    # 这里判断是否是更新操作(如果创建Entry时也想同步更新,就去掉这个if)
    if not created:
        # 只更新Blog的last_changed字段,用update_fields减少不必要的数据库操作
        instance.blog.save(update_fields=['last_changed'])

步骤2:注册信号

为了让Django启动时能加载到这个信号,需要在应用的apps.py文件中修改配置:

from django.apps import AppConfig

class YourAppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = '你的应用名称'  # 替换成实际的app name

    def ready(self):
        # 导入信号模块,确保信号被注册
        import 你的应用名称.signals

然后在项目的settings.py里,把INSTALLED_APPS中你的应用改成这个自定义的配置类:

INSTALLED_APPS = [
    # ...其他应用
    '你的应用名称.apps.YourAppConfig',
    # 替换原来的'你的应用名称'
]

额外说明

  • 用post_save而不是pre_save,是为了确保Entry的更新已经落库后再去更新Blog,保证数据一致性。
  • update_fields=['last_changed']的作用是只更新指定字段,避免触发Blog模型的其他信号或冗余操作,提升性能。
  • 如果需要在创建Entry时也同步更新Blog的时间戳,只需要删除代码中的if not created:判断即可。

内容的提问来源于stack exchange,提问作者mart1n

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:26:05