password jsonfield framework create django-rest-framework django-serializer

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