有时,我们会将一些变化很大的字段保存到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)
包装而不是优雅。
我们是否有办法自动而非侵入地执行此类技巧?
答案 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)