Python 如何让Django管理员缓存内联线上的select选项?
使用Django 1.11、Python 3.6 我这一点运气都没有。我试图优化一个缓慢的Django管理页面,该页面由于大量的Python 如何让Django管理员缓存内联线上的select选项?,python,django,python-3.x,Python,Django,Python 3.x,使用Django 1.11、Python 3.6 我这一点运气都没有。我试图优化一个缓慢的Django管理页面,该页面由于大量的select下拉列表和多个内联线而产生大量重复的SQL查询 我尝试过使用cacheops库和Redis存储,但没有缓存任何东西,即使我使用'*.*.':{ops':'all',timeout':60*60},将所有内容设置为自动缓存。我认为这可能是因为管理员似乎绕过了普通的Django ORM对象 说到这里,我尝试实现一个定制的对象管理器,它使用cachetoolsli
select
下拉列表和多个内联线而产生大量重复的SQL查询
我尝试过使用cacheops
库和Redis存储,但没有缓存任何东西,即使我使用'*.*.':{ops':'all',timeout':60*60},
将所有内容设置为自动缓存。我认为这可能是因为管理员似乎绕过了普通的Django ORM对象
说到这里,我尝试实现一个定制的对象管理器,它使用cachetools
library的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:06350[DEBUG]django.db.backends:(0.003)QUERY='选择[cms_角色].[id],[cms_角色].[date_added],[cms_角色].[date_modified],[cms_角色].[name]从[cms_角色]按[cms_角色].[name]ASC'-PARAMS=();args=()
**跳过了20次以上的重复**
2018-06-04 11:49:07572[DEBUG]django.db.backends:(0.002)QUERY='选择[cms_角色].[id],[cms_角色].[date_added],[cms_角色].[date_modified],[cms_角色].[name]从[cms_角色]按[cms_角色].[name]ASC'-PARAMS=();args=()
这是超过一秒钟的重复SQL查询!如何阻止它执行此操作???在cacheops中禁用管理中的自动缓存。解释如下: 哦,缓存在管理中被明确禁用 这是一个历史性的决定,我不知道我是否应该在下一个主要版本中关闭它,但现在它仍然是这样。要在admin中缓存,您需要覆盖
.get\u queryset()
方法,并自己在queryset上调用.cache()
但不确定各种选择的查询集是如何形成的。在cacheops中禁用了管理中的自动缓存。解释如下: 哦,缓存在管理中被明确禁用 这是一个历史性的决定,我不知道我是否应该在下一个主要版本中关闭它,但现在它仍然是这样。要在admin中缓存,您需要覆盖
.get\u queryset()
方法,并自己在queryset上调用.cache()
但不确定各种选择的查询集是如何形成的。我在考虑使用CacheManager时,这不起作用,因为它实际上在缓存查询集,而此时可能还没有执行查询集,所以我不会缓存结果。我还确认Cacheops正在缓存常规查询,即在管理页面之外。这只是管理员的问题。在模型中,这是什么
class admin
?据我所知,它不起任何作用,而管理是以另一种方式构建的。我认为使用CacheManager时,这不起作用,因为它实际上在缓存queryset,而queryset当时可能尚未执行,所以我没有缓存结果。我还确认Cacheops正在缓存常规查询,即在管理页面之外。这只是管理员的问题。在模型中,这是什么class admin
?据我所知,它什么也不做,管理是以另一种方式构建的。