python - Django 中的属性缓存 - 有什么意义?

标签 python django django-models

我刚刚查看了 EveryBlock 的源代码,我注意到 alerts/models.py 代码中的这段代码:

    def _get_user(self):
    if not hasattr(self, '_user_cache'):
        from ebpub.accounts.models import User
        try:
            self._user_cache = User.objects.get(id=self.user_id)
        except User.DoesNotExist:
            self._user_cache = None
    return self._user_cache
    user = property(_get_user)

我已经注意到了很多这种模式,但我不太明白它的用途。整个想法是确保在访问 self (self = alert object) 上的 FK 时,您只从数据库中获取用户对象一次吗?你为什么不只依赖数据库缓存和 django 的 ForeignKey() 字段?我注意到模型定义只包含用户 ID 而不是外键字段:

class EmailAlert(models.Model):
     user_id = models.IntegerField()
     ...

如有任何见解,我们将不胜感激。

最佳答案

我不知道为什么这是一个 IntegerField;看起来它绝对应该是一个 ForeignKey(User) 字段——您会因此而丢失 select_related() 之类的东西以及其他东西。

至于缓存,许多数据库不缓存结果——它们(或者更确切地说,操作系统)会将获取结果所需的数据缓存在磁盘上,因此第二次查找应该比第一次更快, 但它仍然需要工作。

它仍然需要一个数据库往返来查找它。以我的经验,使用 Django 进行项目查找可能需要大约 0.5 到 1 毫秒,对于本地 Postgresql 服务器的 SQL 命令加上有时不平凡的 QuerySet 开销。如果您不需要,1 毫秒已经很多了——这样做几次,您就可以将 30 毫秒的请求变成 35 毫秒的请求。

如果您的 SQL 服务器不在本地并且您实际上有网络往返要处理,那么数字会变得更大。

最后,人们通常期望访问属性的速度很快;当它们复杂到足以引起 SQL 查询时,缓存结果通常是个好主意。

关于python - Django 中的属性缓存 - 有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1150368/

相关文章:

Python attrs/cattrs 使用卡住的 attrs 类作为字典键序列化字典

python - Django - 导入错误 : No module named apps

python - 编写具有访问 Django 数据库功能的 Python 程序的最简单方法

python - django 异构查询集代理模型

python - 如何检查 Cerberus 中的引用完整性?

python - 如何检索元类方法

python - 第 60 行,在 make_tuple 中返回 tuple(l) TypeError : iter() returned non-iterator of type 'Vector'

django - 遍历自定义模板标签传递的列表

sql - 关于 Django 中的嵌套集合和查询效率的问题

django - 根据选定的父节点显示子节点