Django子类化一个子类化抽象基类的类

时间:2013-02-12 05:20:47

标签: python django inheritance abstract-class

我尝试在Django 1.4.3中执行以下操作:

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中的一大堆事情。

谢谢,

今朝

2 个答案:

答案 0 :(得分:2)

假设您在Imager或ImagerB上没有任何其他字段,那么您可以使用proxy models

这允许您为基类保留一个db表,并让Imager和ImagerB共享数据 - 它确实像正确的面向对象的继承一样工作。问题是您不能在子类上有其他字段。但是,如果你有一点灵活性,那么你可以在基类上使字段可选,然后在子节点上要求或隐藏它们。

更新

我仍然无法使用以下代码,但它可能会提供一些想法。

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)

答案 1 :(得分:0)

它将显示在Imager表中而不是ImagerB

Imager继承自抽象类The_Image_Abstract,但它有自己的表。虽然ImagerB继承自非抽象类Imager,但Imager中的字段放在Imager表中。