0

我尝试在 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 的一大堆事情。

谢谢,

时代

4

2 回答 2

2

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

这允许您为基类保留一个 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)
于 2013-02-12T08:01:11.967 回答
0

它不会显示在Imager表中ImagerB

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

于 2013-02-12T05:41:57.027 回答