Prefetch не работает для foreignKey's related_name? (Результат в n + 2 запросах)
# models.py
class Author(models.Model):
name = CharField()
class Book(models.Model):
title = CharField()
author = ForeignKey(Author, related_name="books")
# serializer.py
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ["id", "title"]
class AuthorSerializer(serializers.ModelSerializer):
books = serializers.SerializerMethodField()
class Meta:
model = Author
fields = ["id", "name", "books"]
def get_books(self, obj):
qs = obj.books
return BookSerializer(qs, many=True).data
# views.py
class AuthorListView(generics.ListAPIView):
queryset = Author.objects.all().prefetch_related("books")
serializer_class = AuthorSerializer
Кажется относительно простым, но я все еще получаю n + 2 запросы?
Я ожидаю получить всего 2 запроса - один на всех авторов и один на все книги?
Если я действительно упрощаю набор запросов моего представления до Author.objects.all(), я получаю n + 1 запросов.
Редактировать
Если я устанавливаю BookListView вместо queryset = Book.objects.all().select_related("author"), то префетчинг происходит нормально и на результирующей странице всего 1 запрос.
Ах, не берите в голову. На самом деле я упорядочивал свои книги в своем методе Serializer, который добавлял дополнительные запросы:
def get_books(self, obj):
qs = obj.books.order_by(XXX)
return BookSerializer(qs, many=True).data
Если я удалю это упорядочивание, то это действительно просто два запроса.