Django中的部分模型继承

时间:2014-02-05 12:11:28

标签: django django-models django-inheritance

我有一个模型,我将其用作创建另一个模型的参考点:

class ImYourFather(models.Model):
    force = fields.HTMLField(null=True, blank=True)
    supermarket_planets = models.HTMLField(null=True, blank=True)
    destroying_planets = models.HTMLField()

class Luke(ImYourFather):
    # Inheriting all the fields from father
    the_cool_kid = models.HTMLField() # extra field added

不要想要继承destroying_planets字段,这可能吗?
我具体问的是因为destroying_planets在父模型中应该是强制,但我想在子模型中使用可选。 /> 这是以另一种方式实现的吗?

1 个答案:

答案 0 :(得分:2)

您无法部分继承,但可以使用所需的任何字段手动创建模型。这与multi-table inheritance不完全相同,但这是部分继承字段的唯一方法:

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