django rest framework - jsonfield - Cómo eliminar dinámicamente los campos de la salida del serializador
django rest framework serializer password (3)
Estoy desarrollando una API con el marco Django Rest, y me gustaría eliminar dinámicamente los campos de un serializador. El problema es que necesito eliminarlos según el valor de otro campo. ¿Cómo podría hacer eso? Tengo un serializador como:
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")
Como puede ver, ya estoy eliminando el campo "url" dependiendo de si la solicitud se realizó desde una plataforma móvil. Pero, me gustaría eliminar el campo "elementos" dependiendo del valor "tipo". ¿Cómo debo hacer eso?
Gracias por adelantado
Puede personalizar el comportamiento de serialización anulando el método to_representation()
en su serializador.
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
U puede crear múltiples serializadores y elegir el adecuado a la vista
class IndexView(APIView):
def get_serializer(self):
if self.request.GET[''flag'']:
return SerializerA
return SerializerB
use herencia para hacer serializadores SECO.
Mi problema era similar al tuyo y lo resolví con herencia.
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'',
)