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

时间:2016-06-23 08:03:58

标签: django-rest-framework django-serializer

我正在使用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")

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

提前致谢

3 个答案:

答案 0 :(得分:20)

您可以通过覆盖序列化程序中的to_representation()方法来 customize the serialization behavior

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 

答案 1 :(得分:4)

您可以创建多个序列化程序并在视图中选择正确的序列化程序

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

使用继承来使序列化程序DRY。

答案 2 :(得分:0)

我的问题与你的问题有些类似,我用继承解决了这个问题。

class StaticSerializer(serializers.ModelSerializer):

    class Meta:
        model = StaticModel
        fields = (
            'first_name', 'last_name', 'password', 'username',
            'email'
        )


class DynamicSerializer(StaticSerializer):

    class Meta:
        model = StaticModel
        fields = (
            'first_name',
        )