Группировка по полю в сериализаторе для DRF
Я пытаюсь сгруппировать все мои статьи по категориям для DRF. У меня есть следующий serializers.py:
class GroupPageSerializer(serializers.ModelSerializer):
sound = serializers.FileField(required=False)
image = Base64ImageField(max_length=None, use_url=True)
category = serializers.PrimaryKeyRelatedField(
many=True, queryset=Category.objects.all())
url = serializers.CharField(allow_null=True, required=False, default=None, allow_blank=True)
english = serializers.CharField(source="base", required=False, allow_blank=True)
per_language = PerLanguageCondensedSerializer(many=True, required=False, read_only=True)
target = serializers.CharField(required=False, allow_null=True, allow_blank=True)
base = serializers.CharField(required=False)
class Meta:
model = Page
fields = ['per_language', 'base', 'target', 'english', 'date', "json", "id", "category", "title", "image", "sound", "url", "slug"]
А это в моем файле views.py:
class GroupedArticleListView(generics.ListAPIView):
queryset = Page.objects.select_related().all()
serializer_class = GroupPageSerializer
filter_backends = (filters.DjangoFilterBackend, OrderingFilter)
pagination_class = LimitOffsetPagination
ordering_fields = ['date']
filter_class = ArticleMultiValue
Я пытался написать класс сериализатора списков, пытался написать различные функции "to_representation" и т.д.
Все, что я хочу, это чтобы все мои результаты были сгруппированы по категориям, как например:
"business": [
{article1...},
{article2...}
],
"technology": [
{article3...},
{article8...},
],
etc
Как мне это сделать?
В этом случае необходимо изменить основную модель вашего ViewSet, или создать другой ViewSet:
class CategoryListView(generics.ListAPIView):
queryset = Category.objects.select_related().all()
serializer_class = CategorySerializer
Сериализаторы:
class PageSerializer(serializers.ModelSerializer):
sound = serializers.FileField(required=False)
image = Base64ImageField(max_length=None, use_url=True)
category = serializers.PrimaryKeyRelatedField(
many=True, queryset=Category.objects.all())
english = serializers.CharField(source="base", required=False, allow_blank=True)
per_language = PerLanguageCondensedSerializer(many=True, required=False, read_only=True)
target = serializers.CharField(required=False, allow_null=True, allow_blank=True)
base = serializers.CharField(required=False)
class Meta:
model = Page
fields = ['per_language', 'base', 'target', 'english', 'date', "json", "id", "category", "title", "image", "sound", "url", "slug"]
class CategorySerializer(serializers.ModelSerializer):
your_related_page_field_name = PageSerializer(many=True)
class Meta:
model = Page
fields = '__all__'