[英]How to propagate parent attributes in 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
有沒有辦法從基類傳播屬性和方法,這樣我就不必使用相關名稱進行訪問了嗎?
為什么不將它作為util添加到BaseA
:
class BaseA(models.Model):
def some_method(self):
return self.related.some_method()
如果這就是所謂的一個非A
BaseA
,它會引發一個AttributeError
是順理成章。 如果要傳播所有方法,則可以覆蓋__getattr__
。 如果在BaseA
實例本身上找不到該屬性,則只會查看self.related
:
class BaseA(models.Model):
def __getattr__(self, item):
return getattr(self.related, item)
但是,像這樣動態地添加屬性應該是最后的選擇,這會使代碼導航和調試更加困難,並使其他IDE功能(如代碼完成)無法使用。 IMO,最好將您可能實際要調用的所有方法明確地放在類的BaseA
實例上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.