【问题标题】:django multi-table inheritance, access method from child from instance of parentdjango多表继承,从父实例的子访问方法
【发布时间】:2016-07-15 07:33:03
【问题描述】:

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

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

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

经过大量搜索,我发现this tutorial,成功。

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

但在Multi-Table继承中实现多态性似乎是一种略显繁琐的方式。

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

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

【问题讨论】:

    标签: django inheritance django-models multi-table-inheritance


    【解决方案1】:

    有django-model-utils 应用程序与Inheritance Manager。它会自动将您的父类转换为子实例。来自文档的示例:

    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 检查this 问题以获得通用解决方案。 并查看 Jeff Elmore 撰写的很棒的 article 关于此主题的内容。相当老了,但仍然很棒。

    【讨论】:

    • 谢谢,我会尽力了解这一切并尽快回复。再次感谢:)
    • 不,实际上我无法让它工作。另外,我认为随着数据的增长,性能下降将是可见的。我可以通过电子邮件将代码发送给您吗?
    猜你喜欢
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2020-01-07
    • 2013-09-25
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    相关资源
    最近更新 更多