Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何让Django管理员缓存内联线上的select选项?_Python_Django_Python 3.x - Fatal编程技术网

Python 如何让Django管理员缓存内联线上的select选项?

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

使用Django 1.11、Python 3.6

我这一点运气都没有。我试图优化一个缓慢的Django管理页面,该页面由于大量的
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
?据我所知,它什么也不做,管理是以另一种方式构建的。