1

我有一个模型用作参考点来创建另一个模型:

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中应该是强制性的,但我想在子模型中让它是可选的。
这可以通过其他方式实现吗?

4

1 回答 1

2

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

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
于 2014-02-05T12:22:26.030 回答