Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否有方法检查是否已提取模型字段?_Python_Peewee - Fatal编程技术网

Python 是否有方法检查是否已提取模型字段?

Python 是否有方法检查是否已提取模型字段?,python,peewee,Python,Peewee,假设我有一个用户模型,它有一个指向Usertype的外键 如果我只是检索我的用户而不加入Usertype表,那么当我最终访问该用户类型时,将有一个额外的查询来检索该用户类型 我的问题是,是否有办法检查此类字段是否已填充,或者我的访问是否会触发提取 大概是这样的: class Usertype(BaseModel): name = CharField(max_length=32) def serializable(self): return {

假设我有一个用户模型,它有一个指向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

然而,这看起来不是一个很好的方法,它会弄乱内部字段。

好吧,从技术上讲,是的,有办法,但不是你想要选择的方法。 我在代码中找到了缓存数据的地方。若您选中第行,您将看到下一个代码:

# 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’”。我同意它不漂亮,可能会被更改。我将拭目以待,看科利弗能否提供一种更受支持的方法。