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

Если я удалю это упорядочивание, то это действительно просто два запроса.

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