gpt4 book ai didi

python - Django 代理模型的继承和多态性

转载 作者:行者123 更新时间:2023-12-01 01:53:09 25 4
gpt4 key购买 nike

我正在开发一个我没有启动的 Django 项目,并且面临继承问题。
我有一个名为 MyModel 的大模型(在示例中进行了简化),它应该代表不同类型的项目。

MyModel 的所有实例对象应具有相同的字段,但方法行为根据项目类型的不同而有很大差异。

到目前为止,它是使用名为 item_type 的单个 MyModel 字段来设计的。
然后 MyModel 中定义的方法检查该字段并使用多个 if 执行不同的逻辑:

def example_method(self):
if self.item_type == TYPE_A:
do_this()
if self.item_type == TYPE_B1:
do_that()

更重要的是,某些子类型有许多共同点,因此假设子类型 BC 代表第一级继承。然后这些类型具有子类型,例如 B1B2C1C2(在下面的示例代码)。

我想说这不是执行多态性的最佳方法。

现在我想更改这些模型以使用真正的继承。

由于所有子模型都有相同的字段,我认为多表继承是没有必要的。我正在考虑使用代理模型,因为只有它们的行为应该根据它们的类型而改变。

这是我提出的伪解决方案:

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

def do_something(self):
pass


class ModelA(MyModel):
class Meta:
proxy = True

def __init__(self, *args, **kwargs):
super().__init__(self, *args, **kwargs)
self.item_type = TYPE_A

def do_something(self):
return 'Hola'


class ModelB(MyModel):
class Meta:
proxy = True

def common_thing(self):
pass

class ModelB1(ModelB):
class Meta:
proxy = True

def __init__(self, *args, **kwargs):
super().__init__(self, *args, **kwargs)
self.item_type = TYPE_B1

def do_something(self):
pass


class ModelB2(ModelB):
class Meta:
proxy = True

def __init__(self, *args, **kwargs):
super().__init__(self, *args, **kwargs)
self.item_type = TYPE_B2

def do_something(self):
pass

如果我们已经知道我们正在处理的对象的类型,这可能会起作用。
假设我们想要实例化一个 C1 类型的 MyModel 对象,那么我们可以简单地实例化一个 ModelC1 并且 item_type 将被正确设置。

问题是如何从通用 MyModel 实例中获取正确的代理模型?

最常见的情况是当我们获得查询集结果时:MyModel.objects.all(),所有这些对象都是 MyModel 的实例,它们对代理一无所知。

我见过不同的解决方案,例如 django-polymorphic但据我了解,这依赖于多表继承,不是吗?

我见过的几个SO答案和自定义解决方案:

但他们都没有 100% 说服我..

考虑到这可能是一种常见的情况,有人想出了更好的解决方案吗?

最佳答案

当您在基本模型中使用 django-polymorphic 时,您将免费获得此转换行为:

class MyModel(PolymorphicModel):
pass

当您执行 MyModel.objects.all()

时,从它扩展的每个模型(代理模型或具体模型)都将被强制转换回该模型

关于python - Django 代理模型的继承和多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50525301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com