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

