2013-02-12 65 views
0

類的類我試圖做在Django 1.4.3如下:Django的子類是繼承一個抽象基

class The_Image_Abstract(models.Model): 
    create_time = models.DateTimeField() 
    class Meta: 
     abstract = True 

class Imager(The_Image_Abstract): 
    time2 = models.DateTimeField() 

class ImagerB(Imager): 
    time3 = models.DateTimeField() 

但這樣做執行syncdb時CREATE_TIME場不ImagerB顯示爲一個場。任何想法如何顯示?否則,我將不得不從ImagerB中的Imager重複一大堆事情。

感謝,

今朝

回答

0

它會顯示在Imager表中沒有ImagerB

Imager繼承自抽象類The_Image_Abstract,但它有自己的表。而從非抽象類ImagerImagerB繼承,所以擺在Imager表中Imager領域。

+0

那麼,什麼是子類熱像儀的地步呢?我想堅持的子類和子類再晾乾,使ImagerB成像儀的更爲特殊的版本。現在我不得不在ImagerB中再次使用ImagerB中的一些東西,如果我使用ImagerB(The_Image_Abstract) – Seperman 2013-02-12 06:13:00

+0

您仍然可以這樣做,django會爲您提供'ImagerB'對象,其中包含來自'Imager'的字段,但內部它會創建不同的表格。希望您已閱讀此https://docs.djangoproject.com/en/dev/topics/db/models/#model-inheritance – Rohan 2013-02-12 08:08:50

+0

我所說的問題是在Imager中定義的字段顯示在ImagerB中,但是在ImagerB中沒有顯示Imager基礎的抽象基類中的字段。沒有這些,ImagerB對我來說毫無用處。基本上ImagerB應該是更專業的Imager版本。 – Seperman 2013-02-12 18:07:50

2

假設你沒有在成像器或ImagerB任何附加字段,那麼你可以使用proxy models

這可以讓你保留一個數據庫表的基類和具有成像儀和ImagerB共享數據 - 它真的就像適當的面向對象的繼承。問題是你不能在子類上有額外的字段。但是,如果你有一點靈活性,那麼你可以使這些字段的基類,然後要求或隱藏他們的孩子選購。

UPDATE

我還沒有設法讓下面的代碼工作,但它可能會提供一些思路。

class TheImage(models.Model): 
    create_time = models.DateTimeField() 
    field2 = models.CharField(max_length=64, blank=True, null=True) 
    field3 = models.TextField(blank=True, null=True) 

class Imager(TheImage): 
    class Meta: 
     proxy = True 

    def __init__(self, *args, **kwargs): 
     for f in self._meta.fields: 
      if f.name == 'field2': 
       f.editable = False 
      if f.name == 'field3': 
       f.blank = False: 
     super(Imager, self).__init__(*args, **kwargs) 

class ImagerB(TheImage): 
    class Meta: 
     proxy = True 

    def __init__(self, *args, **kwargs): 
     for f in self._meta.fields: 
      if f.name == 'field3': 
       f.editable = False 
      if f.name == 'field2': 
       f.blank = False: 
     super(ImagerB, self).__init__(*args, **kwargs) 
+0

這非常有趣。讓我試試看,我會公佈結果。 – Seperman 2013-02-13 00:42:10