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
相关产品推荐
相关产品推荐

