有时,我们保存一些对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)
,这又不是很好。我们是否有一种方法可以自动且非侵入性地进行这种操作?
最佳答案
要设置该值,您必须在实例级别执行此操作。因此,通过在模型中创建自定义方法或仔细使用信号,您可以完成此操作。
为了获取结果,您可以使用自定义管理器和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)
关于python - 如何为Django模型实例创建非数据库自动属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46701634/