相关疑难解决方法(0)

Django formset,查询每个表单的关系字段

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个查询.

  • 1为PurOrder实例,
  • 1表示PurOrderItem实例
  • 20为PurOrderItem的选定材料.

想想看,如果有1000个PurOrderItem

使用提供的select_related,它将材料添加到PurOrderItemselect,但是当它显示它时,我想,它再次查询.

我使用django-autocomplete-light,因此它使我无法查询所有材质实例,但它会不断查询所选材质,即使我选择了相关材质也能显示它.

理想情况下,我会选择具有预取purorderitem和相关材料的PurOrder实例,这意味着3个查询.当轮到他们时,将使用预取的purorderitem和材料.

请建议我避免选择查询的方法.

注意:我尽量避免在这里缓存.

UPDATE

我创建这个问题很久以后,我尝试了解决方案.问题是,formset的形式彼此不了解.因此,提供的查询集的selected_related或prefetch_related查找不会传递给formset表单.

python django django-models django-forms django-queryset

15
推荐指数
1
解决办法
580
查看次数

在Django表单中缓存ModelChoiceField或ModelMultipleChoiceField的查询集选项

在Django表单中使用ModelChoiceFieldModelMultipleChoiceField时,有没有办法传入一组缓存的选项?目前,如果我通过queryset参数指定选项,则会导致数据库命中.

我想使用memcached缓存这些选项,并在显示具有此类字段的表单时防止对数据库的不必要的命中.

django django-forms django-admin django-cache django-queryset

12
推荐指数
2
解决办法
4899
查看次数

创建Django formset而无需多个查询

我需要在页面上显示模型的多个表单(最多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进行解决?

python django django-forms

5
推荐指数
1
解决办法
759
查看次数