受け入れられる解決策は、結果が返される回数だけデータベースにヒットします。各結果について、データベースへのcount
の照会が行われます。
質問はシリアライザにアノテーションを追加することです。これは、レスポンスの各項目に対してcount
クエリを実行するより効果的です。そのため
ソリューション:
models.py
class Author(models.Model):
name = models.CharField(...)
other_stuff = models...
...
class Book(models.Model):
author = models.ForeignKey(Author)
title = models.CharField(...)
publication_year = models...
...
serializers.pyデータベースでカウントを行います
class BookSerializer(serializers.ModelSerializer):
authors = serializer.IntegerField()
class Meta:
model = Book
fields = ('id', 'title', 'authors')
views.py
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.annotate(authors=Count('author'))
serializer_class = BookSerializer
...
レベルを避け、tを避けるoデータベースをヒットして、返された
Book
アイテムのそれぞれの著者数を取得します。
plsは説明できますか?Fiverのソリューションが多くのクエリを生成する理由を教えてください。 querysetが実行された後、シリアライザフィールドが処理されると思っていました。これは適切な結合/グループ化を行いますか? – DmitrySemenov
私は 'Field(source = 'annotated_field')' – outoftime
@DmitrySemenovで作成しました。ソース引数は変数ではなくメソッドを参照すると思います。前に私のコードで "source = 'author_set.count'"を持っていましたが、多くのクエリを生成していました(デバッガから見ることができます)、ほとんどのクエリが繰り返し実行され、countメソッドが呼び出されました。 – Tobias