我正在尝试确定一个简单的缓存技巧是否真的有用。我知道 Django 查询集懒得提高效率,但我想知道它们是否在调用数据后保存查询结果。
例如,如果我有两个模型:
class Klass1(models.Model):
k2 = models.ForeignKey('Klass2')
class Klass2(models.Model):
# Model Code ...
@property
def klasses(self):
self.klasses = Klass1.objects.filter(k2=self)
return self.klasses
我在某处调用klass_2_instance.klasses[:],然后访问数据库并返回一个查询。我想知道如果我再次调用 klass_2_instance.klasses ,数据库会被第二次访问,还是 django 查询会保存第一次调用的结果?
请您参考如下方法:
Django 不会为你缓存它。
除了 Klass1.objects.filter(k2=self),你可以只做 self.klass1_set.all()。 因为 Django 总是在 1-n 关系的多边上创建一个集合。
我猜这种缓存很复杂,因为它应该记住所有使用的过滤器、排除和 order_by。尽管它可以使用任何设计良好的哈希来完成,但您至少应该有一个参数来禁用缓存。
如果你想要任何缓存,你可以这样做:
class Klass2(models.Model):
def __init__(self, *args, **kwargs):
self._klass1_cache = None
super(Klass2, self).__init__(*args, **kwargs)
def klasses(self):
if self._klass1_cache is None:
# Here you can't remove list(..) because it is forcing query execution exactly once.
self._klass1_cache = list(self.klass1_set.all())
return self._klass1_cache
当您在所有相关对象中循环多次时,这非常有用。对我来说,当我需要多次循环时,它经常发生在模板中。
