Models.py
class Material(BaseModelClass):
material = models.CharField(max_length=25, verbose_name='Material')
def __str__(self):
return self.material
class PurOrder(BaseModelClass):
order_number = models.CharField(max_length=25)
class PurOrderItem(BaseModelClass):
order = models.ForeignKey(PurOrder, on_delete=models.CASCADE)
material = models.ForeignKey(Material, on_delete=models.PROTECT)
Run Code Online (Sandbox Code Playgroud)
我创建了一个PurOrder表单和PurOrderItem表单集
PurOrderForm = modelform_factory(PurOrder, fields=('order_number',))
PurOrderFormset = inlineformset_factory(PurOrder, PurOrderItem,fields=('material',))
Run Code Online (Sandbox Code Playgroud)
初始化如下.
form = PurOrderForm(instance=order_instance)
queryset = order_instance.purorderitem_set.all().select_related('material',)
formset = PurOrderFormset(instance=order_instance, queryset=queryset)
Run Code Online (Sandbox Code Playgroud)
如果选择的purorder有20个PurOrderItem,则此设置会花费22个查询.
想想看,如果有1000个PurOrderItem
使用提供的select_related,它将材料添加到PurOrderItemselect,但是当它显示它时,我想,它再次查询.
我使用django-autocomplete-light,因此它使我无法查询所有材质实例,但它会不断查询所选材质,即使我选择了相关材质也能显示它.
理想情况下,我会选择具有预取purorderitem和相关材料的PurOrder实例,这意味着3个查询.当轮到他们时,将使用预取的purorderitem和材料.
请建议我避免选择查询的方法.
注意:我尽量避免在这里缓存.
UPDATE
我创建这个问题很久以后,我尝试了解决方案.问题是,formset的形式彼此不了解.因此,提供的查询集的selected_related或prefetch_related查找不会传递给formset表单.
在Django表单中使用ModelChoiceField或ModelMultipleChoiceField时,有没有办法传入一组缓存的选项?目前,如果我通过queryset参数指定选项,则会导致数据库命中.
我想使用memcached缓存这些选项,并在显示具有此类字段的表单时防止对数据库的不必要的命中.
django django-forms django-admin django-cache django-queryset
我需要在页面上显示模型的多个表单(最多10个).这是我用来完成此任务的代码.
TheFormSet = formset_factory(SomeForm, extra=10)
...
formset = TheFormSet(prefix='party')
return render_to_response('template.html', {
'formset' : formset,
})
Run Code Online (Sandbox Code Playgroud)
问题是,在我看来,Django在数据库中查询formset中的每个表单,即使它们中显示的数据是相同的.
这是Formsets的工作方式还是我做错了什么?在django中是否有解决方法或者我是否必须使用JavaScript进行解决?