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.
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 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') class MenuView(viewsets.ModelViewSet): queryset = Menu.objects.all() queryset = queryset.toplevel() serializer_class = MenuItemModuleSerializerSé 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')