Python 使用inlineformset_factory(和crispy)时,大量SQL查询/呈现速度较慢

Python 使用inlineformset_factory(和crispy)时,大量SQL查询/呈现速度较慢,python,django,django-crispy-forms,Python,Django,Django Crispy Forms,带有屏幕截图的示例项目: 与作者、书籍和出版商合作的项目 有一个更新作者的视图,您可以在其中更改作者拥有的所有书籍以及添加新书。使用inlineformset_工厂创建图书表单。书籍也有一个外键引用(publisher),可以在图书表单中选择 渲染: {% crispy form %} {% crispy formset formset.form.helper %} 问题: 对于每一种图书形式,似乎都有对所有出版商的要求 我有点理解对发布者的请求,因为它们可以在隐式模型ChoiceFiel

带有屏幕截图的示例项目:

与作者、书籍和出版商合作的项目

有一个更新作者的视图,您可以在其中更改作者拥有的所有书籍以及添加新书。使用inlineformset_工厂创建图书表单。书籍也有一个外键引用(publisher),可以在图书表单中选择

渲染:

{% crispy form %}
{% crispy formset formset.form.helper %}
问题:

  • 对于每一种图书形式,似乎都有对所有出版商的要求
我有点理解对发布者的请求,因为它们可以在隐式模型ChoiceField中选择。但我不应该通过预回迁来加快速度吗?我有一种感觉,在view.py的第12行和第13行中传递的Author实例可能会被“复制”,从而忘记任何预取的数据


如果直接解决方案不可能b/c的ModelChoiceField限制,那么在我的情况下,如果在添加书籍(但仅显示)后无法更改出版商,该解决方案也会起作用。不知道如何做到这一点,虽然没有太多的变化。

我们看不到任何代码,使这种猜测游戏。您提到了与预回迁相关的内容,但它没有显示在您链接到的代码中。一般来说,我会这样做

queryset=Book.objects.prefetch_related('publisher').filter(author=id_author)
BookInlineFormSet = inlineformset_factory(Author, Book, form=BookForm, extra=2, can_delete=False)
bookformset = BookInlineFormSet(instance=author, prefix="main", queryset=queryset)

而且我猜每本书都有一个出版商。因此,它不会与预回迁相关,而是选择与回迁相关。

谢谢,我将尝试完成示例代码。执行类似的预取_related(),但忽略结果。我认为这是b/c的情况。每本书的ModelChoiceField提供了现有所有出版商的选择。但是当我发布一个示例项目时,希望它会更有意义。我刚刚添加了一个示例项目(并且在我原来的项目中发现了另一个问题,所以至少现在问题是一致的:)。我认为这可能是大量SQL查询的原因:-尽管我刚刚发现,如果没有那么多查询,它似乎也很慢。。。