模型.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)
我创建了一个采购订单表单(PurOrder form),以及一个采购订单条目表单集(PurOrderItem formset)
PurOrderForm = modelform_factory(PurOrder, fields=('order_number',))
PurOrderFormset = inlineformset_factory(PurOrder, PurOrderItem,fields=('material',))
以下是它们的初始化方式。
form = PurOrderForm(instance=order_instance)
queryset = order_instance.purorderitem_set.all().select_related('material',)
formset = PurOrderFormset(instance=order_instance, queryset=queryset)
如果选择的purorder有20个PurOrderItem,则此设置将花费我22个查询。
- 1个用于PurOrder实例,
- 1个用于PurOrderItem实例,
- 20个用于这些PurOrderItem的选定材料。
考虑一下,如果有1000个PurOrderItem。
使用提供的select_related,它会将材料添加到PurOrderItemselect中,但是当要显示它时,我认为它会再次查询。
我使用django-autocomplete-light,所以它可以避免查询所有材料实例,但它仍会查询所选材料,以便在选择相关材料时显示它。
理想情况下,我希望选择具有预取的purorderitem和相关材料的PurOrder实例,这意味着只需要3个查询。当轮到它们时,将使用预取的purorderitem和材料。
请建议我避免所选选择查询的方法。
注意:我试图避免使用缓存。
更新
很长时间之后,我尝试了提供的解决方案。问题是,formset的表格彼此不知道。因此,提供的queryset的selected_related或prefetch_related查找未传递到formset表格中。
prefetch_related
函数:https://docs.djangoproject.com/en/2.0/ref/models/querysets/#django.db.models.query.QuerySet.prefetch_related - Dan Lupascu