Как установить 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"]