¿Cómo cambiar dinámicamente la profundidad en los serializadores nesteds de Django Rest Framework?

Tengo un conjunto de serializadores nesteds que tienen un conjunto de depth en sus respectivas clases Meta . Me gustaría cambiar mediante progtwigción la profundidad según los parámetros que se pasan en las vistas.

 class ResourceSerializer(serializers.ModelSerializer): type = serializers.PrimaryKeyRelatedField(queryset=EntityType.objects.all()) tags = serializers.PrimaryKeyRelatedField(queryset=Tag.objects.all(), many=True) class Meta: model = Resource fields = ('id', 'type', 'uri', 'tags', 'created_date') depth = 1 

Desafortunadamente, no parece haber una manera de anular el atributo de depth en tiempo de ejecución. Mi solución actual ha sido heredar los serializadores “superficiales” y anular sus clases Meta para ajustar la profundidad.

 class ResourceNestedSerializer(ResourceSerializer): class Meta(ResourceSerializer.Meta): depth = 2 

Y en mi opinión:

  if nested: serializer = ContainerNestedSerializer(containers, many=True) else: serializer = ContainerSerializer(containers, many=True) return Response(serializer.data) 

¿Hay alguna forma de ajustar la depth antes de llamar serializer.data ?

Aquí está mi código que incorpora los campos de inclusión / exclusión, así como el ajuste dynamic de la profundidad. Ajústalo a tu gusto. 🙂

 class DynamicModelSerializer(serializers.ModelSerializer): """ A ModelSerializer that takes an additional `fields` argument that controls which fields should be displayed, and takes in a "nested" argument to return nested serializers """ def __init__(self, *args, **kwargs): fields = kwargs.pop("fields", None) exclude = kwargs.pop("exclude", None) nest = kwargs.pop("nest", None) if nest is not None: if nest == True: self.Meta.depth = 1 super(DynamicModelSerializer, self).__init__(*args, **kwargs) if fields is not None: # Drop any fields that are not specified in the `fields` argument. allowed = set(fields) existing = set(self.fields.keys()) for field_name in existing - allowed: self.fields.pop(field_name) if exclude is not None: for field_name in exclude: self.fields.pop(field_name)