[英]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.