首页 > 解决方案 > Django defer() 和 only() 查询集不起作用?

问题描述

如果我误解了查询集中 defer() 或 only() 的正确用法,请指导我。

这是我试图从 Donor 模型中仅获取选定字段数据以加快处理速度的代码,因为它有 2000 个条目,并且当我使用 all() 时,它需要时间来获取数据。

def donor(request):
        # donors = Donors.objects.all()
        donors = Donors.objects.only('donorid','donor_type','title','donor_name','address',
                                       'mobile_no','jamatkhana')
        # donors = Donors.objects.defer('donorid','donor_type','title','donor_name','address',
                                       'mobile_no','jamatkhana')
        return render(request,"hod_template/add_donor_template.html",{"donors":donors})

使用“only()”或“defer()”后,结果仍然与“all()”相同,没有一个选定的字段既不是延迟的也不是唯一的。即使加载时间比 all() 还要多。

请告诉我如何从供体模型中仅获取这些选定的字段数据。我还告诉你我也尝试过“Values()”方法,但问题是“jamatkhana”字段是 ForeignKey,我也想要它的数据。但是使用“Values()”方法它只获取值而不是外键内部数据。希望我解释得当?

标签: djangodjango-modelsdjango-viewsdjango-queryset

解决方案


但问题是该jamatkhana领域是ForeignKey,我也想要它的数据。

可能获取引用的相关对象是ForeignKey瓶颈。您可以使用.select_related(…)[Django-doc]JOIN在数据库端创建一个,从而jamatkhana使用相同的查询获取相关字段的数据。如果没有.select_related(…),它将进行额外的查询 Donor获取相关数据,因此这很容易导致对数据库的大量额外查询。

因此,您可以使用以下方式渲染它:

donors = Donors.objects.select_related('jamatkhana')

然而,正如@AbdulAzizBarkat指出的那样,通常分页用于减少从网络服务器到客户端的数据量,并且通常通过对查询集进行切片,您还可以减少从数据库到 Django 的带宽(有时是查询的数量) /Python 层。


推荐阅读