Django не будет кешировать его для вас.
Вместо Klass1.objects.filter (k2 = self) вы можете просто сделать self.klass1_set.all ().
Потому что Django всегда создает множество во многих отношениях 1-n отношений.
Я думаю, что этот тип кеша сложен, потому что он должен запоминать все используемые фильтры, exclude и 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
Это очень полезно, когда вы многократно повторяете цикл во всех связанных объектах. Для меня это часто случается в шаблоне, когда мне нужно сделать цикл более одного раза.