2013-03-05 31 views
1

我試圖創建unicode和我想從繼承表中獲取該領域。就像這樣:訪問父類中的基礎模型的領域,而不抽象

class EnvelopeBase(models.Model): 
    name = models.CharField(
     max_length=50 
     ) 
    ...........   

class Envelope(EnvelopeBase): 
    category = models.ForeignKey(
     EnvelopeCategory, 
     blank=True, null=True 
     ) 

    ........ 

    def __unicode__(self): 
     return "{0}: {1}".format(self.category, self.name) 

注意,我在信封模型創建Unicode,我試圖讓「self.name」,這是從EnvelopeBase模型。我沒有得到錯誤,但輸出爲空。如何訪問Envelope模型中的ENvelopeBase模型中的名稱字段?

UPDATE:

我想要做的就是這樣的,例如顯示分類和信封名稱:

讓說我有類=「儲蓄」和包絡=「維護」

輸出必須是(從Unicode的實現):

def __unicode__(self): 
    //the self.name here return null 
    return "{0}: {1}".format(self.category, self.name) 

Output: "Savings: maintenance" 

但我的問題是ONL ÿ* 儲蓄(類別) *無需維護(信封)。該self.name是從中我試圖訪問外圍模型

+0

你能展示一個關於如何使用這些模型來獲得意外輸出的簡化代碼片段嗎? – 2013-03-05 04:00:28

+0

感謝您的更新。我正在尋找這樣的東西: 'envelope = Envelope(name ='Sam',category = some_category_instance); envelope.save(); print(envelope); print(envelope .__ unicode __())' 根據您當前的模型,輸出結果會是什麼樣的? – 2013-03-05 04:17:59

+0

@ZebDeOs我沒有保存它。我試圖展示他們。 – catherine 2013-03-05 04:24:15

回答

2

當在django模型中使用繼承時,會爲父模型和子模型創建兩個表。 的外鍵列被添加到與被意指一個相應的行父表的名稱Parent_ptr_id子模型。

比方說,我們有兩個模型(親子):

class Parent(models.Model): 
    parent_field = models.CharField(max_length=50) 
    def __unicode__(self): 
     return self.parent_field 

class Child(Parent): 
    child_field = models.CharField(max_length=50) 
    def __unicode__(self): 
     return self.parent_field + ': ' + self.child_field 

當你創建子模型的實例,你應該也指定parent_field。

child = Child(child_field='a', parent_field='b') 

如果您不指定parent_field,則插入的新父行將parent_field設置爲null。這可能發生在您的數據上。

此外,當您創建子模型的實例,你可以指定一個現有parent_ptr_id。

child = Child(child_field='c', parent_field='d', parent_ptr_id=1) 

這將導致現有父的parent_field被更新爲新值。最棘手的部分是,如果你沒有在這裏指定parent_field已經存在的父行中的parent_field將被更新爲null。這可能也發生在您的數據上。

除此之外,您現有的代碼應該工作。 (據我所知,不需要self.envelopebase.name)

+0

非常酷,我實際上不知道這種關係類型,直到她提到她不想要抽象。感謝澄清。 – Ngenator 2013-03-05 12:26:36

+0

歡呼,希望它有幫助。 – jurgenreza 2013-03-05 15:52:42

1

你想使你的基礎模型抽象https://docs.djangoproject.com/en/dev/topics/db/models/#abstract-base-classes

class EnvelopeBase(models.Model): 
    name = models.CharField(
     max_length=50 
    ) 

    ........... 

    class Meta: 
     abstract = True 


class Envelope(EnvelopeBase): 
    category = models.ForeignKey(
     EnvelopeCategory, 
     blank=True, null=True 
    ) 

    ........ 

    def __unicode__(self): 
     return "{0}: {1}".format(self.category, self.name) 

另一種方式EnvelopeBase模型MULT表繼承https://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance

基本上,你沒有做任何事情。 Django自動在兩者之間創建一對一的關係。基類中的所有字段都將在父類中可用,但數據將存在於不同的表中。

class EnvelopeBase(models.Model): 
    name = models.CharField(
     max_length=50 
    ) 

    ........... 


class Envelope(EnvelopeBase): 
    category = models.ForeignKey(
     EnvelopeCategory, 
     blank=True, null=True 
    ) 

    ........ 

    def __unicode__(self): 
     return "{0}: {1}".format(self.category, self.envelopebase.name) 
+0

謝謝,但不要使用抽象。該EnvelopeBase模型也處理數據庫中的數據 – catherine 2013-03-05 04:47:48

+0

我真的陷入了這個問題...... – catherine 2013-03-05 04:48:14

+0

我相信你不正確地使用模型繼承。 – Ngenator 2013-03-05 04:50:14