14

同じアプリ内に、他の3つのモデル(と見なす)へのA制限の選択肢を持つ一般的な外部キー関係を含むモデルがあります。また、使用できない汎用外部キーやその他のクエリセット操作の制限を知っています。BCDfilterget

したがって、このようなことを実現するA.objects.filter(generic_object__name="foo")には、最初にB、C、およびDのオブジェクトをクエリセットとしてフィルタリングし、それらを反復処理し、一般的な逆の関係を使用してAオブジェクトをリスト(クエリセットではない)として取得する必要があります。

クエリは直接ではないため、データベースのSQLパフォーマンスにどのように影響するかはわかりません。

PS:汎用の外部キーを使用する必要があるので、モデルを再設計するのではなく、SQLの改善を提案してください。

Django1.4.3とPostgresを使用します。

4

3 に答える 3

17

David Cramerからのいくつかの言葉を引用したいと思います:Disqusの開発者、Djangoコミッショナー

一般的な関係は問題ありません。それらは遅くはなく、コードベースで管理するのがより難しいだけです。

多くの人が、遅いので一般的な関係を使用しないと他の人に言うのを見ましたが、それがどのように遅いかは決して言いません。

于 2013-01-15T09:18:06.727 に答える
3

モデルに index_together メタ オプションを追加します。

class Meta:
    index_together = [('cprofile_id', 'cprofile_type')]
于 2016-09-28T15:14:10.727 に答える