Как динамически удалять поля из выходных данных сериализатора

Я разрабатываю API с платформой Django Rest и хочу динамически удалять поля из сериализатора. Проблема в том, что мне нужно удалить их в зависимости от значения другого поля. Как я мог это сделать? У меня есть сериализатор вроде:

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" в зависимости от того, был ли запрос выполнен с мобильной платформы. Но я хотел бы удалить поле "elements" в зависимости от значения "type". Как мне это сделать?

Заранее спасибо

Ответ 1

Вы можете настроить поведение сериализации, переопределив метод 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 

Ответ 2

Вы можете создать несколько сериализаторов и выбрать правильный вид

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

используйте наследование для создания сериализаторов DRY.

Ответ 3

Моя проблема была несколько похожа на вашу, и я решил ее с наследованием.

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',
        )