有时,我们保存一些对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/

10-12 00:02
查看更多