我尝试在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中的一大堆事情。
谢谢,
今朝
答案 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
表中。