Как установить Serializer для отображения родительских и дочерних элементов в виде списка DRF?

Я создаю приложение, которое посвящено новостям. Новости имеют атрибут под названием Категория, который может быть вложенным. Например: Человек: --BodyOrgans: ----Hand Чтобы сделать проблему более ясной Нам нужно подготовить способ, чтобы при создании новостей, когда мы выбираем категорию Human, мы могли получить доступ к дочерней категории "BodyOrgan" и при выборе этой категории получить доступ к "Hand" или другим дочерним категориям, которые у нее могут быть. Вот мой файл с моделями:

```
class News(models.Model):
    PUBLISH_STATUS = (
        ('P', 'Published'),
        ('W', 'Waiting for approval'),
        ('D', 'Draft'),
    )
    title = models.CharField(max_length=255)
    slug = models.SlugField(null=True, blank=True)
    sign_image = models.ImageField(upload_to='images', null=True, blank=True)
    summary = models.TextField(null=True, blank=True)
    description = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    publish_status = models.CharField(max_length=1, choices=PUBLISH_STATUS, default='D')
    publish_time = models.TimeField(null=True, blank=True, default=None)
    publish_date = models.DateTimeField(null=True, blank=True, default=None)
    author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    category = models.ManyToManyField('Category')
    tag = models.ManyToManyField('Tag')

    def __str__(self):
        return self.title


class Category(models.Model):
    PUBLISH_CHOICES = (
        ('A', 'Active'),
        ('I', 'Inactive'),
    )
    parent = models.ForeignKey('Category', on_delete=models.PROTECT, null=True, blank=True)
    name = models.CharField(max_length=50, null=True)
    publish_status = models.CharField(max_length=1, choices=PUBLISH_CHOICES, default='A')
    description = models.TextField(null=True, blank=True)
    tag = models.ManyToManyField('Tag')

    def __str__(self):
        return self.name
```

А также Serializer:

class CategorySerializer(ModelSerializer):
    class Meta:
        model = Category
        fields = ['name', 'parent']

    list = ListSerializer(
        fields=['name', 'parent'],
        source='get_parent'
    )

    @staticmethod
    def get_parent(obj):
        return obj.parent.name



class NewsSerializer(ModelSerializer):

    @staticmethod
    def get_title_slug(instance):
        return slugify(instance.title)

    @staticmethod
    def get_user(obj):
        return obj.author.username

    slug = SerializerMethodField(method_name='get_title_slug', read_only=True)
    author = SerializerMethodField(method_name='get_user')

    class Meta:
        model = News
        fields = '__all__'
        category = CategorySerializer()
        read_only_fields = ['author', 'publish_date', 'publish_time']

Я буду очень благодарен, если вы сможете мне помочь _/_

Если вы пытаетесь получить категории с их детьми, сначала используйте related_name для более легкого доступа к детям:

parent = models.ForeignKey('Category', on_delete=models.PROTECT, null=True, blank=True, related_name="children")

Затем вы можете получить доступ к дочерним категориям через клавишу children.

Теперь просто используйте вложенный сериализатор:

class CategoryChildrenSerializer(serializer.ModelSerializer):

    class Meta:
        model = Category
        fields = [...]


class CategorySerializer(ModelSerializer):
    children = CategoryChildrenSerializer(many=True)
    
    class Meta:
        model = Category
        fields = [..., "children"]
Вернуться на верх