8

私は、多くの外部キー フィールドを持つモデルを持っています。たとえば、フィールド 'type'、'level'、'color'、'intensity' (単なる一般的な例) を持つモデル Product です。

次に、インライン フォームセットとして製品を含むタイプ フォームを使用して、特定のタイプのすべての製品を編集するページを作成しますextra=10

私が非常に奇妙に感じるのは、テンプレートの外部キー選択フィールドの1つを出力するたびに、Djangoがオプションを取得するためにデータベースにクエリを実行することです(毎回)。

例えば:

{% for form in formset %}
    {{ form.level }}
    {{ form.color }}
    {{ form.intensity }}
{% endfor %}

20 個の製品 (および 10 個の空の追加フォーム) を使用すると、上記のコードselect * from ...はレベル、色、および強度から 30 個を発行し、合計 90 個のクエリ (Django デバッグ ツールバーを使用して表示) を発行します (3 個で十分なはずです)。オプションがリクエストの途中で変更される可能性はほとんどありませんが、変更されたとしても、新しく追加されたオプションが最後の 5 つのフォームだけに表示されることは絶対に望んでいません。

データベースが不必要にこのように叩かれないように、モデル/フォーム/ビュー/テンプレートを最適化する方法はありますか?

-

免責事項:私はdjangoとpythonに比較的慣れていないため、何らかの方法でこれに対処する方法が必要だと考えずにはいられません。

4

2 に答える 2

2
field_queryset = Test.objects.all()    
for form in formset:
        form.fields['test_field'].queryset = field_queryset

このような。

于 2013-02-08T05:50:15.033 に答える
2

formset で使用されるクエリセットを変更すると、 forloop の各反復でクエリを実行するのではなく、select_related()を使用して FK 結合を生成できます。

于 2012-03-06T11:58:28.253 に答える