首页 > 解决方案 > 在 Django 中,给定一个模型实例,我如何确定 ForeignKey 字段是否已完全水合?

问题描述

语境:

我维护遗留的 Django 代码。在许多情况下,我的代码会接收多个模型对象,每个模型对象都有一个 ForeignKey 或一个手动缓存的属性,代表相同的数据实体。因此引用的数据实体不会改变。但是,并非我收到的所有对象都访问过这些 ForeignKey 字段或缓存的属性,因此这些对象上可能不存在数据,尽管它会在首次访问时延迟加载。

我不容易访问/控制声明模型的代码。

我想找到我拥有的任何一个具有预备缓存的对象,这样我就可以避免访问数据库来检索我所追求的数据(如果没有,我会在必要时这样做)。这是因为该数据的获取足够频繁以至于导致性能问题。

Django 1.6,Python 2.7。

问题

我可以询问我们手动缓存的字段并说internal_is_cached(instance, 'fieldname')而不运行查询。但是,我不能对ForeignKey字段执行此操作。

假设我在 Django 中有一个模型类Foo,如下所示:

class Foo(models.Model):
    bar = models.ForeignKey('BarModel')

问题

如果我从某个地方获得模型的实例Foo,但我不知道是否bar曾经调用过它,或者是否已经急切地获取它,我如何确定读取instance.bar是否会查询数据库?

换句话说,我想从外部确定任意模型的内部缓存是否为给定的 准备好ForeignKey,而关于该模型的状态或来源的其他知识为零。

我试过的

标签: pythondjangocachingormforeign-keys

解决方案


感谢 @Daniel Roseman的澄清。

使用 Django 版本 <= 1.6(您的情况下的工作解决方案)
您可以检查您foo_instance是否有一个_bar_cache属性:

hasattr(foo_instance, "_bar_cache")

就像这里解释的一样。

使用 Django 版本 > 1.6
缓存的字段现在存储在属性中的fields_cachedict 中:_state

foo_instance._state.fields_cache["bar"]

推荐阅读