在查询集级别
你可以使用
.defer('field1', 'field2')
[Django-doc]
防止Django获取某些字段
立即
. 在这种情况下,以后可以用一个额外的查询来获取它们。
因此,您可以编写如下查询:
SomeModel.objects.all().defer('geo_field')
将其从提取中排除。然后查询集包含
SomeModel
对象,因此不是值列表。你定义的行为
体模
(例如,实用方法)可以使用。而且你还是
可以
使用
some_model_object.geo_field
,但在您可以访问相应的值之前,它将需要一个额外的提取。
然而,建议
只有
如果某些列的处理非常重要,请使用这些技巧。毕竟,这种额外的查询也需要时间。如果您经常需要这样的字段,通常只会导致处理成本更高。
构建自定义
Manager
以上当然不是很优雅:现在我们要写
.defer(..)
对于每个查询。但是,我们可以设计一个在访问时自动推迟的管理器。
SomeModel.objects
:
from django.db import models
class GeoManager(models.Manager):
def get_queryset(self):
return super().get_queryset().defer('geo_field')
然后在
体模
我们可以用这个经理
objects
而不是默认的:
class SomeModel(models.Model):
geo_field = ...
objects = GeoManager()
with_geofield = models.Manager()
因此,默认情况下,您将不获取
geo_field
如果您访问
somemodel.objects(某些模型对象)
如果你知道你需要它,你可以用
SomeModel.with_geofield
立即取
地磁场
也。