我正在使用Django内置的form.ModelForm和formset_factory来为用户输入提供一组表单。表单上的某些字段是选择框,这些框中的数据由几个字段组成,因此我希望每个选项都有几个DB命中。但是,当我为每个额外的表单添加额外的表单(例如,通过使用“额外”参数)时,它再次点击DB。例如,如果有4个DB匹配进行1次选择,并且有10个选择,我们预计会有40个查询。但是,如果我添加5个“额外”内联,突然有200 *个查询有4 * 10 * 5。不是formset_factory意识到所有内联的选择框都是一样的吗?为什么这么多的数据库命中?有一个更好的方法吗?在我看来,选择应该生成一次,并用于每个选择框(即,这个特定示例的40个查询)。
答案 0 :(得分:1)
我绝对同意表单集应该足够聪明,不要多次查询它。我遇到过很多次。我最终做了一件事:
class TestFormset(BaseModelFormSet):
def __init__(self, *args, **kwargs):
super(TestFormset,self).__init__(*args, **kwargs)
awesome_models = AwesomeModel.objects.all()
for form in self.forms:
form.fields['awesome_model'].choices = [('', '--------')] + [(x.pk, x.name) for x in awesome_models]
这基本上只运行一个查询,然后手动设置表单集中每个表单的特定字段的选择。