Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

259
Vistas
Serializador de árboles polimórficos Django

Me gustaría serializar todos los nodos en mi PolymorphicMPTTModel con sus campos correspondientes. Siguiendo la documentación django-polymorphic y django-mptt obtengo esto:

 { "count":1, "next":null, "previous":null, "results":[ { "title":"Submenu", "subcategories":[ { "title":"Plato1", "subcategories":[ ] },enter code here { "title":"Plato2", "subcategories":[ ] } ] } ] }

La estructura está bien, pero faltan los campos de los niños.

Modelos:

 class Menu(PolymorphicMPTTModel): parent = PolymorphicTreeForeignKey('self', blank=True, null=True, related_name='children', verbose_name='parent') title = models.CharField("Title", max_length=200) class SubMenu(Menu): titulo = models.CharField("Titulo", max_length=200,default="not defined") class Plato(Menu): titulo = models.CharField("Titulo",max_length=200,default="not defined") descripcion = models.TextField() ingredientes = JSONField() precio = models.PositiveSmallIntegerField(default=0) # Extra settings: can_have_children = False

Serializadores:

 class PlatoSerializer(serializers.ModelSerializer): class Meta: model = Plato fields = ('titulo', 'descripcion', 'ingredientes', 'precio') class SubMenuSerializer(serializers.ModelSerializer): class Meta: model = SubMenu fields = ('titulo',) class MenuItemModuleSerializer(serializers.ModelSerializer): subcategories = serializers.ListSerializer(source="children",child=RecursiveField()) class Meta: model = Menu fields = ('title','subcategories')

Vista:

 class MenuView(viewsets.ModelViewSet): queryset = Menu.objects.all() queryset = queryset.toplevel() serializer_class = MenuItemModuleSerializer
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Sé que llegué un poco tarde a la fiesta, pero tuve el mismo problema y finalmente encontré una solución que me funciona.


Como dice django-rest-polymorphic , necesita un mapeo entre modelos y serializadores:

 class ProjectPolymorphicSerializer(PolymorphicSerializer): model_serializer_mapping = { Menu: MenuItemModuleSerializer, SubMenu: SubMenuSerializer, Plato: PlatoSerializer }

Su RecursiveField() crea una instancia de serializador a partir de su clase principal. Eso hace que todos sus objetos secundarios usen MenuItemModuleSerializer y, por lo tanto, falten campos secundarios.

Cada niño necesita ser mapeado a su serializador usando ProjectPolymorphicSerializer

 RecursiveField(to='ProjectPolymorphicSerializer')

Cambie su MenuItemModuleSerializer a esto:

 class MenuItemModuleSerializer(serializers.ModelSerializer): subcategories = serializers.ListSerializer(source="children", child=RecursiveField(to='ProjectPolymorphicSerializer')) class Meta: model = Menu fields = ('title','subcategories')
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda