我有一个包含许多外键字段的模型,例如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相对较新,并且不禁想到必须有办法以某种方式解决这个问题。
答案 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迭代时执行查询。