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

如何在Django中获取post_save信号接收的Model实例所有字段值

解决方案

你之前尝试的几个写法都不符合Django的API规则:

  • instance.objects.values():objects是Django给模型类提供的查询管理器,只能通过模型类(比如ServiceOrder.objects)调用,不能在单个实例上调用
  • instance.values():values()是QuerySet的方法,仅对查询结果集合生效,单个实例没有该方法
  • list(instance):Django模型实例没有实现迭代返回字段值的逻辑,直接转列表没有意义

推荐实现方式

方法1:使用Django内置model_to_dict(最方便)

这是官方提供的工具,专门用于将模型实例转换为包含字段名和对应值的字典,默认自动排除不可编辑字段,也支持自定义包含/排除字段。

首先导入工具:

from django.forms.models import model_to_dict

修改你的信号函数即可:

@receiver(post_save, sender=ServiceOrder)
def service_order_post_save(sender, instance, created, **kwargs):
    if created:
        # 直接获取所有字段值的字典
        all_fields = model_to_dict(instance)
        print(all_fields)
        # 可选:指定保留/排除字段
        # all_fields = model_to_dict(instance, fields=["id", "order_no"], exclude=["is_deleted"])

方法2:遍历模型元数据手动取值(兼容性最高)

如果需要处理model_to_dict不支持的特殊字段(比如多对多、外键的自定义取值需求),可以直接遍历模型的字段定义取值:

@receiver(post_save, sender=ServiceOrder)
def service_order_post_save(sender, instance, created, **kwargs):
    if created:
        all_fields = {}
        for field in ServiceOrder._meta.get_fields():
            all_fields[field.name] = getattr(instance, field.name)
        print(all_fields)

方法3:使用__dict__属性快速取值(需过滤)

模型实例的__dict__属性会存储所有字段值和Django内部属性,只要过滤掉下划线开头的内部属性即可得到字段字典:

@receiver(post_save, sender=ServiceOrder)
def service_order_post_save(sender, instance, created, **kwargs):
    if created:
        all_fields = {k:v for k,v in instance.__dict__.items() if not k.startswith('_')}
        print(all_fields)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 01:36:01