如何编写包装Django ORM而不使用循环引用的Python类(对于memcaching)?

2024-09-30 14:20:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我的Django应用程序包含以下两个模型:

# Start file person.py
class Person(models.Model):
    name = models.CharField(max_length=254,null=False, blank=False,)

    @property
    def things(self):
        return self.Thing_created_by.all()
# End file person.py

以及

^{pr2}$

我想编写分别名为CachedPersonCachedThing)的包装类,作为这两个类的替换。CachedPerson和{}将充当一个中间件,将Person或Thing的实例加载到memcached中。如果实例已经加载到memcached中,那么它们将返回而不会命中数据库。在

其思想是调用CachedPerson.__init__(self, pk=3)将从数据库中检索{},对其进行序列化,然后使用相应的唯一键将其(及其子CachedThings)存储在memcached中。CachedThing.__init__(self, pk=3)也可以类似地工作。基本上,我复制ORM的副本并将它们存储在memcached中以提高性能。对ORM的所有读/写操作都将由这些包装类处理。在

为了说明这个概念,下面是我希望在memcached中,如果Person#3创建了Thing#4和Thing#5:

{
    "Person_3": {
        "name": "Person #3",
        "things": [<CachedThing #4 Object>, <CachedThing #5 Object>],
    },
    "Thing_4": {
        "name": "Thing #4",
        "created_by": <CachedPerson #3 Object>,
    },
    "Thing_5": {
        "name": "Thing #5",
        "created_by": <CachedPerson #3 Object>,
    },
}

但是,我正在努力编写CachedPerson.__init__(),而不被CachedPerson和CachedThing之间的循环导入引用捕获。调用Person.object.get(pk=3).things()返回Thing#4和Thing#5。{{cd11>但需要调用^ cdhings。这需要导入CachedThing,这将导致循环导入。那怎么办呢?在

我希望Django有一个中间件来为我管理这个复杂的ORM缓存任务。唉,据我所知还没有。从我看到的DjangoMemcached缓存为我呈现了HTML页面。那不是我需要的。我的整个Django应用程序是一系列restfulapi。我没有呈现任何HTML。我需要Django数据库模型保存在缓存中。其中有些非常复杂,访问和修改需要大量的数据库。在


Tags: djangonameself数据库byobjectinitmemcached
1条回答
网友
1楼 · 发布于 2024-09-30 14:20:30

可以在函数/方法内部导入:

class Person(models.Model):
    ...
    @property
    def things(self):
        from myapp.cachedthings import CachedThing
        ...

但是我认为定制ModelManager对于这种任务是一个更好的选择。Google的“django缓存模型管理器”——有很多技巧和应用程序是为此而创建的。在

相关问题 更多 >