Указание методов get для вложенных сериализаторов

В случае вложенных сериализаторов есть ли способ указать метод, который будет получать данные?

class AuthorSerializer(ModelSerializer):
....

class BookSerializer(ModelSerializer):
    authors = AuthorSerializer(many=True)
....

В этом примере я хотел бы перехватить и изменить то, как BookSerializer получает authors. Как мне этого добиться?

вы можете использовать SerializerMethodField, чтобы переопределить способ получения поля authors вместо прямого использования AuthorSerializer(many=True) вы определяете метод в BookSerializer, который извлекает и обрабатывает поле авторы

вы можете написать свой BookSerializer следующим образом:

from rest_framework import serializers

class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = "__all__"

class BookSerializer(serializers.ModelSerializer):
    authors = serializers.SerializerMethodField()

    class Meta:
        model = Book
        fields = "__all__"

    def get_authors(self, obj):
        # Customize how the authors are retrieved
        authors = obj.authors.all()  # modify the logic as per your need here
        return AuthorSerializer(authors, many=True).data

Если вы хотите выполнить фильтрацию, вы обычно делаете это не в сериализаторе, а в ViewSet, например:

from django.db.models import Prefetch
from rest_framework import viewsets


class BookViewSet(ModelViewSet):
    serializer_class = BoolSerializer
    queryset = Book.objects.prefetch_related(
        Prefetch('authors', Author.objects.filter(is_alive=True))
    )

Это также значительно повысит производительность, поскольку все Author будут выбраны в одном дополнительном запросе.

Вернуться на верх