簡體   English   中英

如何在Django模型中傳播父級屬性?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM