假设您在 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)