【问题标题】:django concrete inheritance, __str__(self) in parent fails to pick attribute from childdjango 具体继承,父级中的 __str__(self) 无法从子级中选择属性
【发布时间】:2016-11-12 09:27:22
【问题描述】:

在 Django 中,我使用的具体继承如下:

Client 类是一个具体的父类,具有公共字段。客户可以是个人、合伙企业或公司……

注意:是的,我已经阅读了具体继承的缺点,但是我的数据库将会很小,我希望能够轻松地从 Client 表中强制执行唯一性约束。

对象名称属性仅驻留在子表中(因为个人有 FirstName、MiddleName、LastName 而公司没有)

我想使用父类中的 str(self) 方法返回个人、合伙企业或公司的名称,视情况而定。

在个人模型中,我有 name(self) 方法:

    def name(self):
        if self.Middle_Name is None:
            return self.First_Name + " " + self.Last_Name
        else:
            return self.First_Name + " " + self.Middle_Name + " " + self.Last_Name

在 Client() 模型中,我有 str(self) 方法:

def __str__(self):
    return self.name()

可以理解,当我必须获取所有客户端名称的列表时,我得到 'Client' object has no attribute 'name' 错误。

有没有办法让这个工作?对不起,我对面向对象编程概念和 Django 非常陌生。

【问题讨论】:

    标签: python django inheritance django-models django-admin


    【解决方案1】:

    这是错误的方式。如果您的方法正在引用仅存在于子模型上的属性,那么它应该在该子模型上。作为奖励,这使得逻辑更简单:

    class Client:
        def name(self):
            return self.First_Name + " " + self.Last_Name
    
    class Individual(Client):
        def name(self):
            return self.First_Name + " " + self.Middle_Name + " " + self.Last_Name
    

    【讨论】:

    • 谢谢,但我想在父类中使用 __str__(self) 方法,让 django admin 能够列出所有客户端,而不管它们的命名规则有什么不同。 __str__(self) 方法。我希望我说得通。谢谢
    • 这与这段代码没有任何关系。在 Django 管理中,如果您查看个人列表页面,所有 实例将是个人,即使它们也是客户。所以 none 他们将有 Middle_Name 属性。
    • 再问一个问题,“class Client(Individual):”是什么意思,因为它是从 Client 继承的个体,而不是相反。
    猜你喜欢
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 2020-01-23
    • 2012-03-14
    • 1970-01-01
    相关资源
    最近更新 更多