Организовать выборку только из кэша (обращение к базе данных не допускается)
Django==4.0.5 django-cachalot==2.5.1
Модель:
class General_Paragraph(models.Model):
treaty = models.ForeignKey('treaties.Treaty',
on_delete=models.PROTECT,
db_index=True)
identifier = models.CharField(max_length=100,
blank=False,
null=False,
db_index=True,
unique=True)
Денежный разогрев:
@admin.action(description='Warm cache up')
def warm_up(modeladmin, request, queryset):
MODELS_AND_APPS = {
...
"General_Paragraph": "paragraphs_of_treaties",
...
}
for model_name in MODELS_AND_APPS:
current_model = apps.get_model(app_label=MODELS_AND_APPS[model_name], model_name=model_name)
all_instances = current_model.objects.all()
list(all_instances) # The very warming the cache up.
Проблемный код:
def get_texts_in_languages(treaty, paragraph_identifier, party):
general_paragraph = General_Paragraph.objects.get(treaty=treaty, identifier=paragraph_identifier)
SQL:
SELECT ••• FROM "paragraphs_of_treaties_general_paragraph" WHERE ("paragraphs_of_treaties_general_paragraph"."identifier" = 'Par 1' AND "paragraphs_of_treaties_general_paragraph"."treaty_id" = 1) LIMIT 21
Что мне нужно Я использую Memcached. Поскольку это чтение, я не хочу никакого чтения из базы данных. Все должно запрашиваться из кэша. Насколько я понял, .objects.get(treaty=treaty, identifier=paragraph_identifier) не будет покрываться Django Cachalot.
Помогите, пожалуйста, написать код, который не будет бить по базе данных. Возможны любые разогревы кэша. У меня достаточно ресурсов на хостинге.
Моя проблема в том, что я не могу понять, что делать: возможен ли здесь какой-то элегантный запрос или мне придется перебирать весь кэш?