Как отобразить все дочерние категории из родительской категории в django-rest-framework

Я пытаюсь показать все дочерние категории из родительской категории. Я хочу просто нажать на один конец API и показать все таблицы, которые связаны с этим элементом. Я хочу нажать "Master-Category" и показать все связанные "Category", "Sub-Category" и "Root-Item" в форме Иерархии. Я отображаю все данные, но не могу отобразить их в форме Иерархии.
Может ли кто-нибудь дать мне решение этой проблемы.
Model.py

from django.db import models
from django.contrib.auth.models import User

class MasterCategory(models.Model):
  user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, 
  verbose_name="Created By")
  title = models.CharField(max_length=100, null=False, blank=False)
  description = models.TextField(default='')

  def __str__(self):
    return str(self.title)

  @property
  def category(self):
    data = NewCategory.objects.filter(master_category__id=self.id).values
  return data

  @property
  def sub_category(self):
    data = NewSubcategory.objects.filter(category__id=self.id).values
  return data

  @property
  def root_item(self):
    data = Rootitem.objects.filter(sub_category__id=self.id).values
  return data


class NewCategory(models.Model):
  user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, 
   verbose_name="Created By")
  title = models.CharField(max_length=100, null=False, blank=False)
  description = models.TextField(default="")
  master_category = models.ForeignKey(
    MasterCategory, on_delete=models.CASCADE, null=True, blank=True)

  def __str__(self):
    return str(self.title)


class NewSubcategory(models.Model):
  user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, 
         verbose_name="Created By")
  title = models.CharField(max_length=100, null=False, blank=False)
  description = models.TextField(default="")
  category = models.ForeignKey(NewCategory, on_delete=models.CASCADE, null=True, 
             blank=True)

  def __str__(self):
    return str(self.title)

class Rootitem(models.Model):
  user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, 
         verbose_name="Created By")
  title = models.CharField(max_length=100, null=False, blank=False)
  description = models.TextField(default="")
  sub_category = models.ForeignKey(NewSubcategory, on_delete=models.CASCADE, 
                 null=True, blank=True)

  def __str__(self):
    return str(self.title)

Serializers.py
. Я добавляю @property имя функции в поля MasterCategorySerializer, "category", "sub_category", "root_item"

    from .models import MasterCategory, NewCategory, NewSubcategory, Rootitem
    from rest_framework import serializers

    class MasterCategorySerializer(serializers.ModelSerializer):
      class Meta:
        model = MasterCategory
        fields = ["title", 'category', 'sub_category', 'root_item']


    class NewCategorySerializer(serializers.ModelSerializer):
      class Meta:
        model = NewCategory
        fields = "__all__"



    class NewSubcategorySerializer(serializers.ModelSerializer):
      new_cat = NewCategorySerializer(source='category',read_only=True, many=True)
     class Meta:
        model = NewSubcategory
        fields = "__all__"



    class RootitemSerializer(serializers.ModelSerializer):
      class Meta:
        model = Rootitem
        fields = "__all__"

**Viewset.py**

from API_app.models import MasterCategory
from API_app.serializers import MasterCategorySerializer
from rest_framework import viewsets

class MasterCategoryViewSet(viewsets.ModelViewSet):

  queryset = MasterCategory.objects.all()
  serializer_class = MasterCategorySerializer

Мой желаемый результат, то, что я хочу.

    {
      Electronics <---- Master-Category
                 {
                   Smart-Phone  <---- Category
                               {
                                 Samsung  <---- Sub-Category
                                        {
                                         Samsung S20 Ultra  <---- Root-Item
                                         }
                                }
                   }
    
    }

Измените ваши сериализаторы, как показано ниже. Для этой вложенной структуры вам не нужны свойства. Поскольку таблицы связаны внешним ключом, вы можете определить связанное имя между моделями и присвоить его сериализатору. По умолчанию связанное имя между таблицами - tablename_set.

class RootitemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Rootitem
        fields = "__all__"


class NewSubcategorySerializer(serializers.ModelSerializer):
    rootitem_set = RootitemSerializer(many=True)

    class Meta:
        model = NewSubcategory
        fields = "__all__"


class NewCategorySerializer(serializers.ModelSerializer):
    newsubcategory_set = NewSubcategorySerializer(many=True)
    
    class Meta:
        model = NewCategory
        fields = "__all__"


class MasterCategorySerializer(serializers.ModelSerializer):
    newcategory_set = NewCategorySerializer(many=True)
    class Meta:
        model = MasterCategory
        fields = "__all__"

У нас есть связь между MasterCategory и NewCategory. Поскольку вы не определили related_name, поэтому related name - это newcategory_set, а его ответ - NewCategorySeralizer. Сделайте many=True, потому что они связаны внешним ключом, так как может быть несколько newcategory, связанных с mastercategory. Другие отношения аналогичны вышеприведенному объяснению.

Если вы хотите изменить это стандартное связанное имя, то посмотрите на related_name, вы можете определить его внутри models.ForeignKey()

Вернуться на верх