1

我正在使用多表继承(又名具体继承),其中我有一个名为 Clients 的非抽象模型 + 数据库表,它涉及有关所有客户端的常见细节。

但客户可以是个人、合作伙伴或公司,我为其创建了继承模型和表格。个人有名字+姓氏,公司有其他具体细节等。

当我想要所有客户端的列表时,我希望能够访问客户端的名称(从子表中的列派生)。

经过大量搜索,我发现本教程成功运行。

基本上,它涉及在 Client 表上插入一列,该列将存储 Child 模型的名称。然后使用该名称,识别适当的子模型并访问适当的子方法。

但是在Multi-Table继承中实现多态似乎是一种稍微麻烦的方式。

我想知道自 2012 年以来,Django 是否引入了更好的方法来处理这个问题,还是这仍然是唯一的方法?

如果需要我的代码示例,请告诉我,但提供的链接已经有一个漂亮的示例。

4

1 回答 1

2

继承管理器django-model-utils的应用程序。它会自动将您的父类转换为子实例。来自文档的示例:

from model_utils.managers import InheritanceManager

class Place(models.Model):
    # ...
    objects = InheritanceManager()

class Restaurant(Place):
    # ...

class Bar(Place):
    # ...

nearby_places = Place.objects.filter(location='here').select_subclasses()
for place in nearby_places:
    # "place" will automatically be an instance of Place, Restaurant, or Bar

还要检查这个问题的通用解决方案ContentType。还可以查看Jeff Elmore 撰写的关于此主题的精彩文章。相当老了,但仍然很棒。

于 2016-07-15T11:32:51.950 回答