如何在DRF中通过ViewSet传参动态切换序列化器返回字段
实现单个DRF序列化器动态切换返回字段
你可以通过重写序列化器的__init__方法,接收自定义参数并动态调整返回字段,无需创建第二个序列化器。具体实现如下:
修改序列化器代码(organization_serializer.py)
from rest_framework import serializers from Home.models.organization import Organization # 定义精简模式下返回的字段 DEFAULT_FIELDS = ('id', 'orgName', 'orgAltName', 'orgPlant', 'orgAddress1') class OrganizationSerializer(serializers.ModelSerializer): class Meta: model = Organization fields = '__all__' # 默认返回所有字段 def __init__(self, *args, **kwargs): # 取出传入的all_fields参数,默认值设为True all_fields = kwargs.pop('all_fields', True) # 调用父类初始化方法 super().__init__(*args, **kwargs) if not all_fields: # 过滤并保留指定字段,删除其他字段 allowed_fields = set(DEFAULT_FIELDS) for field_name in list(self.fields.keys()): if field_name not in allowed_fields: del self.fields[field_name]
修改ViewSet代码(organization_viewset.py)
在实例化序列化器时传入all_fields参数即可切换字段模式:
class organizationViewSet(viewsets.ViewSet): def list(self, request): organizations = get_all_organizations(op_format="OBJECT") # 传入all_fields=False启用精简字段模式,True则返回所有字段 org_serializer = OrganizationSerializer(organizations, many=True, all_fields=False) return Response(org_serializer.data)
实现逻辑说明
- 通过
kwargs.pop('all_fields', True)取出自定义参数,避免父类ModelSerializer因识别未知参数报错; - 默认情况下序列化器返回所有字段,当
all_fields=False时,遍历序列化器的字段集合,删除不在DEFAULT_FIELDS中的字段; - 这种方式既保留了单个序列化器的复用性,又能灵活切换字段返回规则,适配不同场景需求。
内容的提问来源于stack exchange,提问作者Prathamesh Pavnoji
相关产品推荐
相关产品推荐

