1

ドキュメントで答えを見つけようとした後、私を悩ませてきた重要ではない質問は役に立ちませんでした。

class Book(models.Model)
    authors = ManyToManyField(Author)

homer = Author.objects.get(pk=1)
iliad = Book.objects.get(pk=2)

iliad.authors.filter(pk=homer.pk).exists()
Book.objects.filter(name='Iliad', authors__in=homer).exists()

最後の2つの主張は、ホーマーがイリアスの作者であるかどうかをテストすると思います。しかし、私は(pk = homer.pk)の部分が嫌いで、クエリセットにオブジェクトが存在するかどうかをテストできる構造があるかどうか疑問に思っていますか?

(homer in iliad.authors)

上記の式も機能する可能性があり、おそらくよりPython的ですが、DBから不必要に多くの作成者を取得する可能性があります。

4

2 に答える 2

0

この特定のケースhomer in iliad.authorsでは、バージョンよりもわずかに遅くなりますexists。ほとんどの本には1人か2人の著者がいるので、DBからすべてを取得することは問題ではありません。

申し訳ありませんが、使用した方法でフィルターを使用せずに、Djangoでこれをより速く行う方法はないと思います。

于 2012-07-27T19:31:18.737 に答える
0

Djangoのクエリセットコードinは、演算子を使用するときにいくつかの最適化を実装します。

より良い洞察を得るためにin、大小のデータセットについて、クエリセットでの使用と他の例での使用のタイミングを試してみます。

于 2012-07-27T19:34:43.597 に答える