Python 是否有方法检查是否已提取模型字段?
假设我有一个用户模型,它有一个指向Usertype的外键 如果我只是检索我的用户而不加入Usertype表,那么当我最终访问该用户类型时,将有一个额外的查询来检索该用户类型 我的问题是,是否有办法检查此类字段是否已填充,或者我的访问是否会触发提取 大概是这样的:Python 是否有方法检查是否已提取模型字段?,python,peewee,Python,Peewee,假设我有一个用户模型,它有一个指向Usertype的外键 如果我只是检索我的用户而不加入Usertype表,那么当我最终访问该用户类型时,将有一个额外的查询来检索该用户类型 我的问题是,是否有办法检查此类字段是否已填充,或者我的访问是否会触发提取 大概是这样的: class Usertype(BaseModel): name = CharField(max_length=32) def serializable(self): return {
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
然而,这看起来不是一个很好的方法,它会弄乱内部字段。好吧,从技术上讲,是的,有办法,但不是你想要选择的方法。 我在代码中找到了缓存数据的地方。若您选中第行,您将看到下一个代码:
# 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'\u usertype\u cache'
。这是一个证明:
所以,从技术上讲,是的,有一种方法。你真的想使用受保护的字段并添加你自己的黑客吗?我不会的。谢谢你的回答!我试着看看这是否可行,显然在我的Peewee版本中,它并不完全是这样。似乎在每个模型中都有一个_obj_缓存字典,它保存该缓存。所以我可以在user.\u obj\u cache中使用“if‘usertype’”。我同意它不漂亮,可能会被更改。我将拭目以待,看科利弗能否提供一种更受支持的方法。