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

Django序列化器中获取两级关联表的子主题ID与显示名

解决办法

方法1:嵌套子序列化器

先给SubTopic写个基础序列化器,再在关联表的序列化器里引用它,就能同时拿到subtopic的ID和显示名称。

# 定义SubTopic的序列化器
class SubTopicSerializer(serializers.ModelSerializer):
    class Meta:
        model = SubTopic
        fields = ['id', 'display_name']

# 修改关联表的序列化器
class CampaignSubTopicAssnSerializer(serializers.ModelSerializer):
    subtopic = SubTopicSerializer()
    
    class Meta:
        model = CampaignSubTopicAssn  # 注意和你实际的模型名对应,原代码里的org_models.ContextualCampaignSubTopicAssn要换成真实模型
        fields = ['subtopic']

# Campaign序列化器保持原有关联
class CampaignSerializer(serializers.ModelSerializer):
    subtopic_assn = CampaignSubTopicAssnSerializer(many=True)
    
    class Meta:
        model = Campaign
        fields = ['name', 'display_name', 'subtopic_assn']  # 加上你需要的Campaign字段

方法2:用SerializerMethodField自定义返回结构

不想多建序列化器的话,直接用自定义方法构造需要的数据:

class CampaignSubTopicAssnSerializer(serializers.ModelSerializer):
    subtopic_info = serializers.SerializerMethodField()
    
    def get_subtopic_info(self, obj):
        return {
            'id': obj.subtopic.id,
            'display_name': obj.subtopic.display_name
        }
    
    class Meta:
        model = CampaignSubTopicAssn
        fields = ['subtopic_info']

# Campaign序列化器不变
class CampaignSerializer(serializers.ModelSerializer):
    subtopic_assn = CampaignSubTopicAssnSerializer(many=True)
    
    class Meta:
        model = Campaign
        fields = ['name', 'display_name', 'subtopic_assn']

方法3:直接在Campaign序列化器里处理

如果觉得前面的麻烦,也可以直接在Campaign的序列化器里生成需要的subtopic列表:

class CampaignSerializer(serializers.ModelSerializer):
    subtopics = serializers.SerializerMethodField()
    
    def get_subtopics(self, obj):
        return [
            {'id': assn.subtopic.id, 'display_name': assn.subtopic.display_name}
            for assn in obj.subtopic_assn.all()
        ]
    
    class Meta:
        model = Campaign
        fields = ['name', 'display_name', 'subtopics']  # 这里用subtopics替代原来的subtopic_assn字段

三种方法各有特点:方法1符合DRF的序列化规范,序列化器可以复用;方法2灵活,能自由定义返回格式;方法3最直接,不用修改其他序列化器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:15:39