【问题标题】:Partial model inheritance in DjangoDjango中的部分模型继承
【发布时间】:2014-02-05 12:11:27
【问题描述】:

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

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

【问题讨论】:

标签: django django-models django-inheritance


【解决方案1】:

您不能部分继承,但您可以使用所需的任何字段手动创建模型。这与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

【讨论】:

  • 谢谢,但我没有修改父类的选项。有没有办法告诉 Django,父亲中的必填字段在孩子中应该是可选的?
  • 嗯...如果你想要这么多,你可以修改父类(提示:monkey patching)——但这会改变父类还!如果您愿意,我可以提供更多详细信息。
  • 那很有用,如果可以的话,请告诉我们更多信息:)
  • 我添加了另一种没有猴子补丁的方法。它未经测试,但应该给你一个想法。
  • 谢谢,当我尝试它并从 Django 得到一些错误时,我会回来的:D
猜你喜欢
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 2011-01-13
相关资源
最近更新 更多