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

2024-03-28 09:26:50 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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\u method方法,因为model\u b.a返回一个BaseA()实例,而不是a(),如果我想访问此方法,我必须:

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

有没有办法从基类传播属性和方法,这样我就不必使用相关的名称进行访问了?你知道吗


Tags: 方法名称basemodel属性modelssomepass
1条回答
网友
1楼 · 发布于 2024-03-28 09:26:50

为什么不把它作为一个util添加到BaseA

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

如果这是为非ABaseA调用的,它将引发一个AttributeError,这是合理的。如果要传播所有方法,可以重写__getattr__。如果在BaseA实例本身上找不到属性,则只查看self.related

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

但是像这样动态地添加属性应该是最后的手段,这样会使代码导航和调试更加困难,并且会使其他IDE特性(如代码完成)无法使用。在我看来,最好是将所有实际需要调用的BaseA实例的方法显式地放在类中。你知道吗

相关问题 更多 >