如何在Django模型中传播父属性?

时间:2017-11-01 12:03:32

标签: python django django-models

有没有办法在父类中传播子属性而不必通过其相关名称访问它?请考虑以下示例:

class BaseA(models.Model):
    pass

class BaseB(models.Model):
    a = models.ForeignKey('BaseA')

class A(BaseA):
    base = models.OneToOneField('BaseA', related_name='related')
    field = models.IntegerField(default=0)

    def some_method(self):
        pass

class B(BaseB):
    base = models.OneToOneField('BaseB')

# code in view
model_b = B()
model_b.a.some_method()

我无法访问 some_method 方法,因为 model_b.a 会返回 BaseA()实例而非 A(),如果我想访问此方法,我必须:

model_b.a.related.some_method()
# or
model_b.a.related.field

有没有办法从基类传播属性和方法,所以我不必使用相关名称进行访问?

1 个答案:

答案 0 :(得分:0)

为什么不将它作为util:

添加到BaseA
class BaseA(models.Model):
    def some_method(self):
        return self.related.some_method()

如果要求非A BaseA,则会引发AttributeError,这似乎是合理的。如果要传播所有方法,可以覆盖__getattr__。如果在self.related实例本身上找不到该属性,则只会查看BaseA

class BaseA(models.Model):
    def __getattr__(self, item):
        return getattr(self.related, item)

但是像这样动态添加属性应该是最后的手段,使代码导航和调试更加困难,并使代码完成等其他IDE功能无法使用。 IMO,最好将您可能真正想要调用的所有方法明确地放在类中的BaseA实例上。