首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django:如何记忆模型管理器方法?

django:如何记忆模型管理器方法?
EN

Stack Overflow用户
提问于 2012-05-18 07:11:59
回答 2查看 812关注 0票数 0

我有一个记忆的Django模型管理器方法,如下所示:

代码语言:javascript
复制
class GroupManager(models.Manager):
    def get_for_user(self, user):
        cache_key = 'groups_%s' % (user.id)
        if not hasattr(self, key):
            groups = get_groups_somehow()
            setattr(self, cache_key, groups)
        return getattr(self, cache_key)

但是memoized值在请求/响应周期之后仍然存在;也就是说,在服务器重新启动之前,不会在后续请求中重新计算该值。这一定是因为管理器实例没有被销毁。

那么,我如何正确地记忆模型管理器方法呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-21 03:29:51

https://stackoverflow.com/a/1526245/287923的启发,我实现了一个请求缓存,如下所示:

代码语言:javascript
复制
from threading import currentThread

caches = {}

class RequestCache(object):
    def set(self, key, value):
        cache_id = hash(currentThread())
        if caches.get(cache_id):
            caches[cache_id][key] = value
        else:
            caches[cache_id] = {key: value}

    def get(self, key):
        cache_id = hash(currentThread())
        cache = caches.get(cache_id)
        if cache:
            return cache.get(key)
        return None

class RequestCacheMiddleware(object):
    def process_response(self, request, response):
        cache_id = hash(currentThread())
        if caches.get(cache_id):
            del(caches[cache_id])
        return response

caches是一个缓存字典的字典,通过get & set方法访问。在呈现响应之后,中间件在process_response方法中清除当前线程的缓存。

它的用法如下:

代码语言:javascript
复制
from request_cache import RequestCache
cache = RequestCache()
cache.get(key)
cache.set(key, value)
票数 0
EN

Stack Overflow用户

发布于 2012-05-18 08:25:49

键值不会重新计算,因为您告诉键值一旦存在就不要重新计算。如果要在后续调用中重新计算它,请重新排序代码

代码语言:javascript
复制
class GroupManager(models.Manager):
    def get_for_user(self, user):
        cache_key = 'groups_%s' % (user.id)
        groups = get_groups_somehow()
        setattr(self, cache_key, groups)
        return getattr(self, cache_key)

如果您想在不重新计算的情况下获得缓存的值,只需在管理器上使用带有正确键的getattr即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10644702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档