有什么方法可以将Django模型用作接口吗? - python

我有许多子类的基类,并且子类中唯一发生变化的是某种方法(模板模式)。但是我被卡住了,无法正常工作。

class Base(models.Model):
    _value = models.CharField(max_length=200)
    _name = models.CharField(max_length=200)
    user = models.ForeignKey(User, related_name="some_set")

    #used as a property
    def value():
        def fget(self):
            self.refresh()
            return self._value

    def refresh(self):
        raise NotImplementedError("..")

class Subclass1(Base):
    def refresh(self):
        self._value = some_val

class Subclass2(Base):
    def refresh(self):
        self._value = some_other_val

我希望能够将整个相关集视为相同的实体,并在每个实体上调用value属性,每个实体都遵循其自己的刷新实现版本,即

for x in user.some_set.all():
    print x.value

但是目前看来,即使在超类中删除了刷新,这似乎也是不可能的。我还考虑过使用策略模式并使用ForeignKey关系来调用该方法,但是我仍然必须在ForeignKey中有一个基类,这些子类是从该基类派生的。

python大神给出的解决方案

使用Proxy Models

从文档

但是,有时您只想更改模型的Python行为–可能更改默认管理器或添加新方法。

这就是代理模型继承的目的:为原始模型创建代理。您可以创建,删除和更新代理模型的实例,所有数据将像使用原始(非代理)模型一样被保存。区别在于您可以更改诸如默认模型排序或代理中的默认管理器之类的内容,而无需更改原始文件。