Как заставить Django Admin кешировать выбранные опции на inline? - PullRequest
0 голосов
/ 04 июня 2018

Использование Django 1.11, Python 3.6

Мне не повезло с этим.Я пытаюсь оптимизировать медленную страницу администратора Django, которая делает много повторяющихся запросов SQL из-за большого количества выпадающих списков select и нескольких встроенных строк.

Я пытался использовать библиотеку cacheops ихранилище Redis, но ничто не кэшируется вообще, даже если я установил all для автоматического кэширования с '*.*': {'ops': 'all', 'timeout': 60*60},.Я предполагаю, что это может быть связано с тем, что администратор, кажется, обходит обычные объекты Django ORM.

Говоря об этом, я попытался просто реализовать специальный менеджер объектов, который кэширует с использованием класса TTLCache библиотеки cachetools:

from django.db import models
from cachetools import TTLCache, cached

cache = TTLCache(maxsize=100, ttl=3600)

class CacheManager(models.Manager):
    @cached(cache)
    def get(self, *args, **kwargs):
        print("Caching get. args: %r. kwargs: %r" % (args, kwargs))
        return super(CacheManager, self).get(*args, **kwargs)

    @cached(cache)
    def all(self, *args, **kwargs):
        print("Caching all. args: %r. kwargs: %r" % (args, kwargs))
        return super(CacheManager, self).all(*args, **kwargs)

    @cached(cache)
    def filter(self, *args, **kwargs):
        print("Caching filter. args: %r. kwargs: %r" % (args, kwargs))
        return super(CacheManager, self).filter(*args, **kwargs)

    @cached(cache)
    def order_by(self, *args, **kwargs):
        print("Caching order_by. args: %r. kwargs: %r" % (args, kwargs))
        value = super(CacheManager, self).order_by(*args, **kwargs)
        print(value)
        return value

    @cached(cache)
    def first(self, *args, **kwargs):
        print("Caching first. args: %r. kwargs: %r" % (args, kwargs))
        return super(CacheManager, self).first(*args, **kwargs)

тогда мой класс модели:

class Role(models.Model):
    date_added = models.DateTimeField(auto_now_add=True)
    date_modified = models.DateTimeField(auto_now=True)
    name = models.CharField(max_length=100, unique=True)

    objects = CacheManager()

    class Admin:
        manager = CacheManager()

Это тоже ничего не делает.Сначала я подумал, что администратору не нужно использовать менеджер объектов на заказ, но я нашел комментарий к StackOverflow о том, что добавление класса Admin с менеджером должно это исправить - но это явно не так, потому что при загрузкеСтраница администратора с ролью select Я получаю это в журнале:

2018-06-04 11: 49: 06,350 [DEBUG] django.db.backends: (0,003) QUERY = 'SELECT [cms_role]. [id], [cms_role]. [date_added], [cms_role]. [date_modified], [cms_role]. [name] FROM [cms_role] ORDER BY [cms_role]. [имя] ASC '- PARAMS = ();args = ()

** еще 20 повторов этого пропущенного **

2018-06-04 11: 49: 07,572 [DEBUG] django.db.backends: (0,002) QUERY ='SELECT [cms_role]. [Id], [cms_role]. [Date_added], [cms_role]. [Date_modified], [cms_role]. [Name] FROM [cms_role] ORDER BY [cms_role]. [Name] ASC' - PARAMSзнак равноargs = ()

Это более секунды повторяющихся запросов SQL!Как я могу остановить это от этого ??

1 Ответ

0 голосов
/ 08 августа 2018

Автоматическое кэширование в админке отключено в cacheops.Это объясняется здесь :

О, кеширование отключено в admin явно.

Это историческое решение, интересно, стоит ли мне его отключить в следующемосновная версия, но пока она остается такой.Для кеширования в админке вам нужно переписать метод .get_queryset() и вызвать .cache() для набора запросов самостоятельно.

Хотя не уверен, как формируются наборы запросов для различных вариантов выбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...