繁体   English   中英

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

[英]Django subclassing a class that is subclassing an abstract base 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中的一大堆事情。

谢谢,

今朝

假设您在Imager或ImagerB上没有任何其他字段,那么您可以使用代理模型

这允许您为基类保留一个db表,并让Imager和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)

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

Imager继承自抽象类The_Image_Abstract ,但它有自己的表。 虽然ImagerB从非抽象类继承Imager ,所以场Imager摆在桌子Imager

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM