您不能部分继承,但您可以使用所需的任何字段手动创建模型。这与多表继承并不完全相同,但这是部分继承字段的唯一方法:
class Base(models.Model):
force = fields.HTMLField(null=True, blank=True)
supermarket_planets = models.HTMLField(null=True, blank=True)
class Meta(object):
abstract = True
class ImYourFather(Base):
destroying_planets = models.HTMLField()
class Luke(Base):
# optional in case you need this
father = models.OneToOneField(ImYourFather, related_name='lukes')
the_cool_kid = models.HTMLField() # extra field added
编辑
另一种方法是简单地从父亲那里复制字段。这都是未经测试的,所以 Django 可能会因为其中一些而对你咆哮)。优点是没有猴子补丁,但应该可以工作:
exclude = ['id', 'destroying_planets']
try: # Django 1.7
fields = {i.attname: i.clone() for i in ImYourFather._meta.fields if not i.attname in exclude}
except AttributeError: # Django < 1.7
fields = {i.attname: deepcopy(i) for i in ImYourFather._meta.fields if not i.attname in exclude}
Base = type('Base', (models.Model,), fields)
class Luke(Base):
# optional in case you need this
father = models.OneToOneField(ImYourFather, related_name='lukes')
the_cool_kid = models.HTMLField() # extra field added