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

Django通用Thumbs模型嵌套序列化器返回空对象问题排查

问题描述

我有一个通用Django模型Thumbs,包含两个关联其他模型的字段:

  • entity_type:CharField类型,取值为family或product,分别对应Family和Product模型
  • entity_id:IntegerField类型,代表关联模型的主键

我想为Thumbs模型创建序列化器,根据entity_type使用对应的嵌套序列化器(比如family类型用FamilySerializer),让序列化结果包含关联实体的数据,但当前实现返回的是空的family对象(Family表中确实存在主键为107的条目)。

当前实现代码

from rest_framework import serializers
from app.models import Thumbs, Family
from app.serializers.user_role_product_tool import FamilySerializer, ProductSerializer

class ThumbSerializer(serializers.ModelSerializer):
    entity = serializers.SerializerMethodField()

    class Meta:
        model = Thumbs
        fields = '__all__'

    def get_entity(self, obj):
        if obj.entity_type == "family":
            return FamilySerializer(source=obj.entity_id, read_only=True).data
        else:
            return None

示例输出

[
  {
    "id": 182,
    "entity": {
      "family_name": "",
      "status": "",
      "created_by": "",
      "last_updated_by": ""
    },
    "entity_id": "107",
    "entity_type": "family",
    "thumbs_decision": "PENDING",
    "entity_parent_id": "181",
    "created_date": "2024-09-03T14:21:17.403159-07:00",
    "last_updated_by": "",
    "last_updated_date": "2024-09-03T14:21:17.403217-07:00",
    "created_by": "guest"
  },
  {
    "id": 212,
    "entity": null,
    "entity_id": "951",
    "entity_type": "product",
    "thumbs_decision": "PENDING",
    "entity_parent_id": "181",
    "created_date": "2024-09-03T14:21:18.647675-07:00",
    "last_updated_by": "",
    "last_updated_date": "2024-09-03T14:21:18.647712-07:00",
    "created_by": "guest"
  }
]

问题原因

当前代码中FamilySerializer(source=obj.entity_id, read_only=True)是错误用法:source参数接收的是对象属性名或序列化上下文键,而非直接传入主键ID。直接传整数obj.entity_id,序列化器无法定位到对应的Family实例,因此生成空对象。

解决方案

需要根据entity_id查询对应模型实例后,再传入序列化器:

from rest_framework import serializers
from app.models import Thumbs, Family, Product
from app.serializers.user_role_product_tool import FamilySerializer, ProductSerializer

class ThumbSerializer(serializers.ModelSerializer):
    entity = serializers.SerializerMethodField()

    class Meta:
        model = Thumbs
        fields = '__all__'

    def get_entity(self, obj):
        if obj.entity_type == "family":
            try:
                family = Family.objects.get(pk=obj.entity_id)
                return FamilySerializer(family).data
            except Family.DoesNotExist:
                return None
        elif obj.entity_type == "product":
            try:
                product = Product.objects.get(pk=obj.entity_id)
                return ProductSerializer(product).data
            except Product.DoesNotExist:
                return None
        else:
            return None

如果数据量较大,可通过批量查询或prefetch_related优化性能,避免重复数据库请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:50:07