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

如何使用Django信号在更新模型字段后自动填充同模型另一指定字段

Django设置任务start_date后自动分配给操作Agent的实现方案

前置说明

我们选择pre_save信号实现该需求,核心逻辑是检测Task实例的start_date字段从空变为有值的状态变更,自动将当前操作的Agent赋值给任务的agent字段。由于Django信号默认无法直接获取请求对象,需要先通过线程本地中间件存储当前请求来获取操作人。

实现步骤

1. 编写请求存储中间件

在对应APP目录下新建middleware.py,存储当前请求到线程本地变量:

import threading
local = threading.local()

class CurrentRequestMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        local.request = request
        response = self.get_response(request)
        # 请求结束后清理变量,避免内存泄漏
        if hasattr(local, 'request'):
            del local.request
        return response

然后在项目settings.py的MIDDLEWARE列表中注册该中间件:

MIDDLEWARE = [
    # ... 其他原有中间件
    'your_app_name.middleware.CurrentRequestMiddleware',
]

注意替换your_app_name为你自己的APP名称

2. 编写信号处理逻辑

在对应APP目录下新建signals.py:

from django.db.models.signals import pre_save
from django.dispatch import receiver
from .models import Task
from .middleware import local

@receiver(pre_save, sender=Task)
def auto_assign_agent_on_start_date_set(sender, instance, **kwargs):
    # 若为新建任务可跳过该逻辑,不需要可删除以下两行
    if not instance.pk:
        return
    # 获取修改前的旧实例数据
    try:
        old_instance = Task.objects.get(pk=instance.pk)
    except Task.DoesNotExist:
        return
    # 触发条件:旧实例start_date为空,新实例已设置start_date,且任务未分配agent
    if old_instance.start_date is None and instance.start_date is not None and instance.agent is None:
        # 获取当前登录用户关联的Agent,假设Agent和User是一对一关联,关联字段为user
        if hasattr(local, 'request') and hasattr(local.request, 'user') and local.request.user.is_authenticated:
            instance.agent = local.request.user.agent

3. 注册信号

修改对应APP的apps.py,在ready方法中加载信号:

from django.apps import AppConfig

class YourAppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'your_app_name'

    def ready(self):
        import your_app_name.signals

可选调整项

  • 若你的Agent模型和Django默认User模型的关联字段不是user,自行修改信号中获取Agent的逻辑即可
  • 若需要支持新建任务时设置start_date也自动分配操作人,删除信号中跳过新建任务的判断即可
  • 非请求场景(如Celery异步任务)修改start_date时,需自行传入操作人信息适配逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:06:05