2013-02-12 63 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