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

如何在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)

实现逻辑说明

  1. 通过kwargs.pop('all_fields', True)取出自定义参数,避免父类ModelSerializer因识别未知参数报错;
  2. 默认情况下序列化器返回所有字段,当all_fields=False时,遍历序列化器的字段集合,删除不在DEFAULT_FIELDS中的字段;
  3. 这种方式既保留了单个序列化器的复用性,又能灵活切换字段返回规则,适配不同场景需求。

内容的提问来源于stack exchange,提问作者Prathamesh Pavnoji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:52:48