Django内联表单集和选择字段会生成太多的数据库查询

时间:2012-03-06 11:47:12

标签: python django inline-formset

我有一个包含许多外键字段的模型,例如model具有字段'type','level','color','intensity'的产品(只是一个通用示例)。

然后我有一个页面来编辑给定类型的所有产品,使用类型表单,产品作为内联formset,并可选择使用extra=10内联添加其他产品。

我觉得非常奇怪的是,每当我输出模板上的一个外键选择字段时,Django会查询数据库以获取选项(每次)。

例如:

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

有20个产品(以及10个空的额外表单),上面的代码从级别,颜色和强度中发出30 select * from ...总共90个查询(使用Django调试工具栏显示),其中3应该足够了。这些选项不太可能在请求中改变,但即使它们确实如此,我绝对不希望一些新添加的选项仅出现在最后5个表单中。

有没有办法优化我的模型/表单/视图/模板,这样数据库不会被不必要地敲打?

-

免责声明:我对django和python相对较新,并且不禁想到必须有办法以某种方式解决这个问题。

2 个答案:

答案 0 :(得分:3)

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

喜欢这个。

答案 1 :(得分:2)

您可以change the queryset used by the formset,然后您可以使用select_related()生成FK连接,而不是在每次forloop迭代时执行查询。