为django模型添加迷你缓存

时间:2009-11-11 03:54:08

标签: django

由于m2m关系,我遇到了Django的性能问题。我有一个Something对象列表,它们都有Something_instance.item_set,所以我多次调用Something_instance.item_set.all()。我想将该查询缓存到Something_instance中,这样我就不必运行这么多查询。这可能吗? (这实际上是让select_related()适用于m2m的黑客攻击。)

编辑: 以下2个片段显示了我遇到的问题。在views.py中,我正在查询m2m关系。

    for t in items:
          try:
              t.price = t.user_item_rel_set.get(user=u).payment_amount
          except:
              t.price = -1 * t.buyer_item_rel_set.get(buyer=u).payment_amount
    return items

此外,我的模型中的一个功能:

def listBuyers(self):
    return self.buyer_item_rel_set.all()

我有这个,因为我在我的模板中使用它来从这些元素中获取信息。

查询m2m关系最终运行两次:一次在views.py中,然后一次在模板中。我想在视图中获取查询集,将其附加到模型实例,然后将其提供给模板,因此它(和views.py代码)使用缓存的查询集,而不是再次获取。

3 个答案:

答案 0 :(得分:4)

是的,我一直这样做。使用listBuyers方法作为示例(顺便说一下,Pythonic惯例是将其称为list_buyers ...)

def listBuyers(self):
    if not hasattr(self, '_buyers'):
        self._buyers = self.buyer_item_rel_set.all()
    return self._buyers

这将在第一次为特定实例调用listBuyers时命中数据库,但之后不会。

答案 1 :(得分:0)

查询已缓存。有关在页面加载期间生成的Django FAQ的信息,请参阅how to view SQL queries

问题可能像缺少索引一样简单(尽管Django的ORM应生成所需的索引)或使用QuerySet的结果的低效代码。我们需要更多信息来帮助排除故障。

答案 2 :(得分:0)

很难说没有看到你的模型及其关系(例如,与用户'u'有什么关系)

但是建议在一个查询中与用户('u')项目相关,而不是一个接一个地计算所需的东西......

BTW ..'t'和'u'不是变量的好名字