如何从序列化程序输出中动态删除字段

FVo*_*Vod 18 django-serializer django-rest-framework

我正在使用Django Rest框架开发API,我想动态删除序列化程序中的字段.问题是我需要根据另一个字段的值删除它们.我怎么能这样做?我有一个序列化器,如:

class DynamicSerliazer(serializers.ModelSerializer):
    type = serializers.SerializerMethodField()
    url = serializers.SerializerMethodField()
    title = serializers.SerializerMethodField()
    elements = serializers.SerializerMethodField()

    def __init__(self, *args, **kwargs):
        super(DynamicSerliazer, self).__init__(*args, **kwargs)
        if self.fields and is_mobile_platform(self.context.get('request', None)) and "url" in self.fields:
            self.fields.pop("url")
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我已经删除了字段"url",具体取决于请求是否已从移动平台完成.但是,我想根据"类型"值删除"元素"字段.我该怎么办?

提前致谢

Rah*_*pta 23

可以通过覆盖序列化程序中to_representation()方法来自定义序列化行为.

class DynamicSerliazer(serializers.ModelSerializer):

    def to_representation(self, obj):
        # get the original representation
        ret = super(DynamicSerializer, self).to_representation(obj)

        # remove 'url' field if mobile request
        if is_mobile_platform(self.context.get('request', None)):
            ret.pop('url')

        # here write the logic to check whether `elements` field is to be removed 
        # pop 'elements' from 'ret' if condition is True

        # return the modified representation
        return ret 
Run Code Online (Sandbox Code Playgroud)


glm*_*rml 5

您可以创建多个序列化程序并在视图中选择合适的一个

class IndexView(APIView):
    def get_serializer(self):
        if self.request.GET['flag']:
            return SerializerA
        return SerializerB
Run Code Online (Sandbox Code Playgroud)

使用继承使序列化程序干燥。