如何为Django模型实例创建非数据库自动属性

时间:2017-10-12 04:51:08

标签: python django django-models

有时,我们会将一些变化很大的字段保存到Redis或其他后端。

但是以这种方式,我们可能会失去通过article.count从实例获取值的便利。

我们通常将属性函数设置为模型,该模型执行查询基于内存的数据库的逻辑。

class WhatEver(models.Model):
    @property
    def some_field(self):
        return redis.hget('what-ever-%s' % self.id)

    def set_some_field(self, value):
        return redis.hset('what-ever-%s' % self.id, value)

丑陋但有用。

但是,它并不是一直有效,因为这是一种让我们有能力的侵入性方式。

说,我们希望得到用户的访问,

我们实际上想要致电user.visits

但是子模块覆盖基本模块并不好,所以我们只能将它作为函数get_user_visits(user)包装而不是优雅。

我们是否有办法自动而非侵入地执行此类技巧?

2 个答案:

答案 0 :(得分:1)

要设置值,您必须在实例级别执行此操作。因此,无论是通过在模型中创建自定义方法,还是通过仔细使用信号,您都可以完成这项工作。

要获取结果,您可以使用自定义管理器和custom method on the manager修饰模型的返回值。

from django.db import models

class RedisManager(models.Manager):
    def visits(self):
        results = []
        for obj in self.model.get_query_set().all():
            obj.visits = redis.hget('what-ever-%s' % obj.id)
            results.append(obj)
        return results

class SomeModelNeedsVisits(models.Model):
    objects = RedisManager()
    # your normal fields here

for obj in SomeModelNeedsVisits.objects.visits():
      print(obj.visits)

答案 1 :(得分:0)

最后,没有现有的解决方案可以解决我的需求。

我已实施并开源:django-in-memory-models

可以pip install django-in-memory-models

安装