2011-09-01 21 views
6

我試圖創建一個Django ORM映射,它與現有的data model兼容,所以我嘗試使用現有的一組表和列名。Django多表繼承:指定自定義的一對一列名

我有一個多表繼承情況,其中一個類的信息對象派生自類對象。我想,讓Django的這個處理的常用方法:

class Object(models.Model): 
    class Meta: 
     db_table = "object"   

class InformationObject(Object): 
    class Meta: 
     db_table = "information_object" 

在這種情況下的Django將在名爲object_ptr_id的繼承模型自動創建一個對一個字段。但是,在我被限制使用的模式中,對Object的引用簡稱爲「id」。所以:

有沒有辦法以某種方式指定列的名稱Django自動奇蹟般用於多表繼承?

另一種選擇,我將不得不以其他方式使用,是使用一個明確的一到一個領域,但後來我將不能夠從對象模型繼承非數據庫的方法:

class Object(models.Model): 
    class Meta: 
     db_table = "object"   

class InformationObject(models.Model): 
    class Meta: 
     db_table = "information_object" 
    id = models.OneToOneField(Object, primary_key=True, db_column="id") 

任何想法?也許我可以爲它們創建一個通用的基類,並將非db方法放在那裏......?

+0

你最後的想法是非常穩固:創造對他們倆的公共基類,並把它作爲一個mixin提供你正在尋找額外的功能。我建議將它作爲一個實驗來嘗試。 (它可能行不通; Django的數據庫層在Python的元類中做了一些相當不錯的事情,但值得一試。) –

回答

8

django docs(開發版本):

如前所述,Django會自動創建一個鏈接OneToOneField你的孩子回類的任何非抽象父模型。如果要控制鏈接回父級的屬性的名稱,可以創建自己的OneToOneField並設置parent_link = True,以指示您的字段是回到父級的鏈接。

1

正如@fusion引用文檔所述,如果要在指定列時使用模型繼承,則必須創建OneToOneField。繼承的字段將在自我作用域和一對一字段中的子類中可用。

class Object(models.Model): 
    class Meta: 
     db_table = "object" 
    column_1 = models.CharField() 

class InformationObject(Object): 
    class Meta: 
     db_table = "information_object" 
    # arbitrary property name (parent_link) 
    parent_link = models.OneToOneField(Object, primary_key=True, db_column="id", parent_link=True) 

在這個例子中:

>>> inf_obj = InformationObject.objects.get(pk=1) 
>>> print inf_obj.column_1 == inf_obj.parent_link.column_1 
True