Как динамически удалять поля из выходных данных сериализатора
Я разрабатываю 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',
)