1

我正在使用多表繼承(又名混凝土繼承),其中我有一個非抽象模型+數據庫表稱爲客戶,它與共同的細節涉及所有客戶。Django多表繼承,從父實例的子訪問方法

但客戶可以是個人,合作伙伴或公司,爲此我創建了繼承模型和表。個人有名字+姓氏,公司有其他具體細節等。

我希望能夠訪問客戶端的名稱(從子表中的列派生),當我想要一個所有的列表客戶端。我發現this tutorial,工作成功。

基本上,它涉及在客戶端表上插入一個列,該列將存儲子模型的名稱。然後使用該名稱識別適當的子模型並訪問適當的子方法。

但是,在多表繼承中實現多態性似乎是一個稍微麻煩的方法。

我想知道自2012年以來,Django是否引入了更好的方法來處理這個問題,還是這仍然是唯一的方法?

請讓我知道,如果我的代碼示例是必需的,但鏈接提供了一個美麗的例子已經。

回答

1

django-model-utils申請Inheritance Manager。它會自動將您的父類轉換爲子實例。從文檔例如:

from model_utils.managers import InheritanceManager 

class Place(models.Model): 
    # ... 
    objects = InheritanceManager() 

class Restaurant(Place): 
    # ... 

class Bar(Place): 
    # ... 

nearby_places = Place.objects.filter(location='here').select_subclasses() 
for place in nearby_places: 
    # "place" will automatically be an instance of Place, Restaurant, or Bar 

同時檢查是否存在與ContentType通用的解決方案this問題。 還可以查看Jeff Elmore關於此主題的精彩article。相當古老,但仍然很棒。

+0

謝謝,我會盡力理解這一切,並儘快發佈回覆。再次感謝:) –

+0

它爲你工作? – valignatev

+0

不,實際上我無法讓它工作。另外,我認爲隨着數據的增長,性能下降將是可見的。我可以通過電子郵件向你發送代碼嗎 –