我正在开发一个我没有启动的 Django 项目,并且面临继承问题。
我有一个大模型(在示例中简化)称为MyModel它应该代表不同类型的项目。
的所有实例对象MyModel都应具有相同的字段,但方法行为根据项目类型而有很大差异。
到目前为止,它是使用一个MyModel名为 的单个字段来设计的item_type。
然后 MyModel 中定义的方法检查该字段并使用多个 if 执行不同的逻辑:
def example_method(self):
if self.item_type == TYPE_A:
do_this()
if self.item_type == TYPE_B1:
do_that()
Run Code Online (Sandbox Code Playgroud)
更重要的是,某些子类型有许多共同点,因此可以说子类型B和C代表第一级继承。然后这些类型有子类型,例如B1, B2, C1, C2(在下面的示例代码中更好地解释)。
我想说这不是执行多态性的最佳方法。
现在我想更改这些模型以使用真正的继承。
由于所有子模型都有相同的字段,我认为多表继承是没有必要的。我正在考虑使用代理模型,因为只有它们的行为应该根据它们的类型而改变。
这是我提出的伪解决方案:
ITEM_TYPE_CHOICES = (
(TYPE_A, _('Type A')),
(TYPE_B1, _('Type B1')),
(TYPE_B2, _('Type B2')),
(TYPE_C1, _('Type C1')),
(TYPE_C2, _('Type C2')))
class MyModel(models.Model):
item_type = models.CharField(max_length=12, choices=ITEM_TYPE_CHOICES)
def common_thing(self):
pass …Run Code Online (Sandbox Code Playgroud) python django proxy-classes django-models django-inheritance