Группировка по полю в сериализаторе для 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__'
Вернуться на верх