假设我有一个User模型,其外键指向Usertype。
如果我只是在没有加入Usertype表的情况下检索我的用户,那么当我最终访问它时,会有一个额外的查询来检索该Usertype。
我的问题是,是否有办法检查此类字段是否已填满,或者我的访问是否会触发提取。
这样的事情:
class Usertype(BaseModel):
name = CharField(max_length=32)
def serializable(self):
return {
'name': self.name
}
class User(BaseModel):
name = CharField(max_length=32)
usertype = ForeignKeyField(Usertype)
def serializable(self):
ret = {
'name': self.name,
}
if self.usertype:
ret['usertype'] = self.usertype.serializable()
return ret
如果我这样做,我的假设是if语句将导致该提取发生。
更新
从Taras回答我能够发现模型上有一个_obj_cache属性,它保存缓存的相关对象。 所以我可以实现我想要的目标:
def serializable(self):
ret = {
'name': self.name,
}
if 'usertype' in self._obj_cache:
ret['usertype'] = self.usertype.serializable()
return ret
但是,这看起来不是一个很好的方法,搞乱了内部领域。
答案 0 :(得分:1)
嗯,技术上 - 是的,有办法,但不是你想要选择的那个。 我正在挖掘代码并找到缓存数据的地方。如果您查看行#382,您会看到下一个代码:
# The related instance is loaded from the database and then cached in
# the attribute defined in self.cache_name. It can also be pre-cached
# by the forward accessor (ForwardManyToOneDescriptor).
try:
rel_obj = getattr(instance, self.cache_name)
except AttributeError:
related_pk = instance._get_pk_val()
说的是'我将从数据库中获取价值,除非它存在于缓存中。缓存的名称是什么? - 在你的情况下是u'_usertype_cache'
。这是一个证据:
所以,从技术上讲 - 是的,有办法。你真的想使用受保护的字段并添加自己的黑客吗?我不愿意。