我有一个模型,我将其用作创建另一个模型的参考点:
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
在父模型中应该是强制,但我想在子模型中使用可选。 />
这是以另一种方式实现的吗?
答案 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