Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

258
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda