这可能听起来像是重复的,但我认为不是。
我需要做一些类似于提问者在那里做的事情:django model polymorphism with proxy inheritance
我的父母需要实现一组方法,让我们称之为MethodA(),MethodB()。这些方法永远不会直接使用,它们将始终通过子模型调用(但不是,抽象类不是出于各种原因的方法)。
但这就变得更加棘手:
每个子模型都继承自特定模块(moduleA,moduleB),它们都实现了相同的方法名称,但做了不同的事情。调用是通过父模型进行的,并根据字段的值重定向到子项
由于我猜它不是很清楚,这里有一些伪代码可以帮助你理解
from ModuleA import CustomClassA
from ModuleB import CustomClassB
class ParentModel(models.Model):
TYPE_CHOICES = (
('ChildModelA', 'A'),
('ChildModelB', 'B'),
)
#some fields
type = models.CharField(max_length=1, choices=TYPE_CHOICES)
def __init__(self, *args, **kwargs):
super(ParentModel, self).__init__(*args, **kwargs)
if self.type:
self.__class__ = getattr(sys.modules[__name__], self.type)
def MethodA():
some_method()
def MethodB():
some_other_method()
class ChildModelA(ParentModel, CustomClassA):
class Meta:
proxy = True
class ChildModelB(ParentModel, CustomClassB):
class Meta:
proxy = True
在ModuleA中:
class CustomClassA():
def some_method():
#stuff
def some_other_method():
#other stuff
在ModuleB中:
class CustomClassB():
def some_method():
#stuff
def some_other_method():
#other stuff
现在,问题是类更改有效,但它不会从ChildModelA或B继承。
这甚至可能吗?如果是的话,我怎么能让它发挥作用,如果没有,我怎么能优雅地做到这一点,而不需要太多的重复?
答案 0 :(得分:0)
代理模型必须完全继承自一个非抽象模型类。似乎 CustomClass
和 ParentModel
都是非抽象的。我建议使 CustomClass
抽象,因为没有定义属性。
此处详细解释了这一点:https://docs.djangoproject.com/en/3.2/topics/db/models/#proxy-models