Skip to main content
 首页 » 编程设计

python之Django 查询在调用后是否保存其结果

2024年09月03日36yxwkf

我正在尝试确定一个简单的缓存技巧是否真的有用。我知道 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 

当您在所有相关对象中循环多次时,这非常有用。对我来说,当我需要多次循环时,它经常发生在模板中。