Указание методов 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
будут выбраны в одном дополнительном запросе.