有没有办法检查是否已获取模型字段?

时间:2017-01-13 20:30:37

标签: python peewee

假设我有一个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

但是,这看起来不是一个很好的方法,搞乱了内部领域。

1 个答案:

答案 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'。这是一个证据: enter image description here

所以,从技术上讲 - 是的,有办法。你真的想使用受保护的字段并添加自己的黑客吗?我不愿意。