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

