Как отобразить категорию и подкатегорию в сериализаторе постов django-rest-framework
Мне нужно извлечь категории и подкатегории в сериализаторе Post, потому что мне нужно поставить пагинацию, если я поставлю пагинацию в представлении категорий, будет приходить разное количество постов, поэтому мне нужно поставить пагинацию в представлении Post, мне нужно вернуть ответ так, чтобы он выглядел так
и я хочу создать rest api для возврата вложенного json, как это
[
{
"id": 1,
"title": "Taomlar",
"subcat": [
{
id: 2,
title: "Milliy",
post: [
{
id: 1,
title: 'Palov',
summa: 300000,
...
},
{
id: 2,
title: 'Palov',
summa: 300000,
...
},
]
},
]
}
]
models.py
class Category(Base):
title = models.CharField(max_length=200)
parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
def __str__(self):
return self.title
class Post(Base):
title = models.CharField(max_length=225)
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='post')
serializers.py
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = '__all__'
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = '__all__'
Может ли кто-нибудь дать мне решение для этой проблемы
вы можете прочитать больше о вложенном сериализаторе в Django Rest Framework
вы должны сделать это таким образом
class CategorySerializer(serializers.ModelSerializer):
post_serializer = PostSerializer(many=True)
class Meta:
model = Category
fields = ['your_field', 'post_serializer']
это базовый пример, попробуйте прочитать о нем больше, чтобы знать, как можно реализовать вложенные отношения
Насколько я понимаю, вам нужно получить каждую категорию с относящимися к ней постами.
Переписывать так:
class CategorySerializer(serializers.ModelSerializer):
posts = serializers.SerializerMethodField()
class Meta:
model = Category
fields = (
'id',
'title',
'posts',
)
def get_posts(self, obj):
serializer = PostSerializer(obj.products.all(), context=self.context, many = True)
return serializer.data