如何让 Django 管理员在内联上缓存选择选项?



使用 Django 1.11, Python 3.6

我对此没有任何运气。我正在尝试优化一个缓慢的 Django 管理页面,由于大量select下拉列表和多个内联,该页面正在进行大量重复的 SQL 查询。

我尝试使用cacheops库和 Redis 存储,但根本没有缓存任何东西,即使我将所有内容设置为使用'*.*': {'ops': 'all', 'timeout': 60*60},自动缓存。我假设这可能是因为管理员似乎绕过了正常的 Django ORM 对象。

说到这里,我尝试只实现一个定制的对象管理器,它使用cachetools库的 TTLCache 类进行缓存:

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 [调试] django.db.backends: (0.003( QUERY = 'SELECT [cms_role]。[同上], [cms_role]。[date_added], [cms_role].[date_modified], [cms_role].[姓名]从 [cms_role] 按 [cms_role] 排序。[姓名]ASC' - 参数 = ((;参数=((

**跳过的 20 次重复 **

2018-06-04 11:49:07,572 [调试] django.db.backends: (0.002( QUERY = 'SELECT [cms_role]。[同上], [cms_role]。[date_added], [cms_role].[date_modified], [cms_role].[姓名]从 [cms_role] 按 [cms_role] 排序。[姓名]ASC' - 参数 = ((;参数=((

这是超过一秒钟的重复SQL查询!我如何阻止它这样做??

admin 中的自动缓存在缓存中被禁用。这里对此进行了解释:

哦,缓存在管理员中明确禁用。

这是历史性的决定,我想知道我是否应该在下一个主要版本中关闭它,但现在它保持这种状态。要在 admin 中缓存,您需要覆盖.get_queryset()方法并自己在查询集上调用.cache()

不确定各种选择的查询集是如何形成的。

最新更新