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

Django REST Framework如何通过同一个API返回不同数据字段

实现方案

1. 改造Serializer支持动态排除字段

修改serializer.py中的StorySerializer,重写初始化方法,支持传入自定义排除字段列表:

class StorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Story
        fields = ("id",
            "title",
            "featured",
            "summary",) # 注意原代码此处summary少了左引号,需补上

    def __init__(self, *args, **kwargs):
        # 取出自定义的排除字段参数,避免传入父类报错
        exclude_fields = kwargs.pop('exclude_fields', None)
        super().__init__(*args, **kwargs)
        if exclude_fields:
            # 遍历移除需要排除的字段
            for field in exclude_fields:
                self.fields.pop(field, None)

2. 改造视图根据路径参数控制返回字段

修改views.py中的StoryList视图,重写get_serializer方法,读取路由传入的参数判断是否需要排除字段:

class StoryList(BaseListAPIView):
    serializer_class = StorySerializer
    model = Story

    def get_serializer(self, *args, **kwargs):
        # 获取路由传递的额外参数
        extra_param = self.kwargs.get('extra_param')
        # 匹配到指定参数addd时,排除featured字段
        if extra_param == 'addd':
            kwargs['exclude_fields'] = ['featured']
        return super().get_serializer(*args, **kwargs)

3. 新增带参数的路由配置

修改路由文件,保留原有路由保证旧接口兼容,新增带参数的路由条目指向同一个视图:

# 原有路由保留,原有访问逻辑不变
url(r"^stories/org/$", StoryList.as_view(), name="api.v1.org_story_list"),
# 新增带参数的路由,参数名和视图中读取的名称保持一致
url(r"^stories/org/(?P<extra_param>\w+)/$", StoryList.as_view(), name="api.v1.org_story_list_extra"),

效果验证

  • 访问/stories/org/时,正常返回id、title、featured、summary全部4个字段
  • 访问/stories/org/addd/时,自动过滤featured字段,仅返回id、title、summary3个字段
  • 后续如果需要扩展其他参数返回不同字段组合,只需在视图的get_serializer方法中新增判断逻辑即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:36:07