在django中大量减少内存使用量,如何安全地使用.only()和.defer()

时间:2013-01-08 07:05:47

标签: python django

对于大多数项目,内存负载最重的是将大数据查询加载到python内存中,如

Model.objects.filter(...).order_by(...)[:50] 
# The second [:50] is evaluated, the entire dataset is shoved into memory.

在django文档中:提及.defer().only()查询集方法作为提示 有助于减少内存使用量,但没有提到更多内容。

我想我的主要问题是,在尝试使用.save()或.delete()模型实例时,是否可以在模型上调用它,除了pk之外的所有延迟? 例如:

model = Model.objects.only("pk").get(pk=12)
# is model.save() or model.delete() okay here?

可能还有其他古怪的案例,其中.only()和.defer()应该被警告,我现在想不出来。它们看起来像是非常有用的方法..如果有人想出任何请发帖,谢谢。

2 个答案:

答案 0 :(得分:2)

我不确定为什么在只有save()字段的模型上调用pk会有用。但是,如果要删除对象而不会产生实例化对象的开销,则可以使用queryset方法:

MyModel.objects.filter(pk=12).delete()

请注意,这不会调用模型上的任何自定义delete()方法,但是获取实例并在其上调用delete会更有效。

答案 1 :(得分:0)

onlydefer始终检索模型的ID,以便正常使用。

然而,如果DEBUG=Truesee docs),Django的orm会为每个查询带来一些内存开销。