gpt4 book ai didi

django - 防止 Django 为 ModelFormSet 中的每个表单查询 ForeignKey 选项

转载 作者:行者123 更新时间:2023-12-04 05:53:37 24 4
gpt4 key购买 nike

我正在为我的 Django 应用程序构建一个 csv 导入表单,并希望在 ModelFormSet 中显示要导入的行。用于验证目的。

因此,我在相关的 ModelAdmin 中添加了一个 View 。它从 csv 读取行并打印 ModelFormSet(queryset=an_empty_queryset, initial={data_from_the_csv}) .

问题是该模型通过 ForeignKey 引用了其他三个模型。字段和 每个表单中的每个字段在表单集中发出一个数据库查询以填充 ModelChoiceField的选项。

为什么 Django 不缓存表单(因为它被多次使用)或者已经有一种我不知道的方法来完成这个?

最佳答案

Django 表单集只是将表单创建的所有细节委托(delegate)给表单对象本身,并且各个表单实例不知道其他表单实例,因此每个实例都必须查询自己的选择也就不足为奇了。

缓存也可能有意想不到的副作用——例如,表单的 __init__函数可能依赖于 initial它接收到的数据,使缓存 form对象不正确。

减少查询数量的最佳方法是检索一次选择查询集,然后将它们传递给它们的构造函数中的表单类。这将需要定义一个自定义 ModelForm和自定义 ModelFormSet .

您的表单将需要一个直接接受选择的构造函数:

from django.forms.models import ModelForm

class MyForm(ModelForm):
def __init__(self, my_field_choices=None, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.fields['my_field'].choices = my_field_choices

并且您的表单集将需要覆盖一个方法来运行查询集并将它们传递到构造它们的表单中:
from django.forms.models import BaseModelFormSet

class MyFormSet(BaseModelFormSet):
def _construct_forms(self):
# instantiate all the forms and put them in self.forms
self.forms = []

# Define each of your choices querysets
my_field_choices = Model.object.filter(...)

#Add your querysets to a dict to pass to the form
form_defaults = {'my_field_choices': my_field_choices, }

for i in xrange(min(self.total_form_count(), self.absolute_max)):
self.forms.append(self._construct_form(i, **form_defaults))

(参见 the Django source 了解其工作原理)

关于django - 防止 Django 为 ModelFormSet 中的每个表单查询 ForeignKey 选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15203207/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com