Ничего плохого в вашем коде, насколько это возможно.Возможно, проблема не в этом, но в том, как вы используете этот код.
Главное, что нужно понять, - это то, что экземпляры модели не имеют идентичности.Это означает, что если вы создаете экземпляр объекта Egg где-нибудь, а другой - где-то еще, даже если они ссылаются на одну и ту же строку базовой базы данных, они не будут иметь общего внутреннего состояния.Поэтому вызов cached_attr
для одного не приведет к заполнению кэша в другом.
Например, если у вас есть класс RelatedObject с ForeignKey to Egg:
my_first_egg = Egg.objects.get(pk=1)
my_related_object = RelatedObject.objects.get(egg__pk=1)
my_second_egg = my_related_object.egg
Здесь my_first_egg
и my_second_egg
оба ссылаются на строку базы данных с pk 1, но они не один и тот же объект:
>>> my_first_egg.pk == my_second_egg.pk
True
>>> my_first_egg is my_second_egg
False
Итак, заполнение кеша на my_first_egg
не заполняет его на my_second_egg
.
И, конечно,объекты не сохраняются в запросах (если только они специально не сделаны глобальными, что ужасно), поэтому кеш также не сохраняется.