假设我们有一个基本模型:
class BaseModel(models.Model):
pass
有一些子类:
class Submodel1(BaseModel):
some_field = models.TextField()
...
class Submodel9(BaseModel):
another_field = models.TextField()
每个子模型都在自己的Django应用程序中定义。可以显示带有新子模型的新应用程序。
我们还有另一个模型,我们称之为RelatedModel
,它应该与BaseModel
具有一对一的关系:
class RelatedModel(models.Model):
the_thing = models.OneToOneField(BaseModel, null=True, blank=True)
如果BaseModel.Meta.abstract == True
可以定义这样的关系吗?
或者根本没有定义BaseModel
?
我已经发布了一些解决方案作为下面的答案,但它们对我来说似乎有点难看。
答案 0 :(得分:3)
https://stackoverflow.com/a/23547494/517316
不是将关系放在RelatedModel
上,而是可以将其放到Submodel1 .. Submodel9
。
class Submodel1(models.Model):
some_field = models.TextField()
related_model = models.OneToOneField(RelatedModel,
null=True, blank=True,
related_name='the_thing')
...
class Submodel9(models.Model):
another_field = models.TextField()
related_model = models.OneToOneField(RelatedModel,
null=True, blank=True,
related_name='the_thing')
或者,如果我们将BaseModel
抽象化,我们可以在BaseModel
中定义它:
class BaseModel(models.Model)
related_model = models.OneToOneField(RelatedModel,
null=True, blank=True,
related_name='the_thing')
class Meta:
abstract = True
这将允许使用名为SubmodelX
的字段从RelatedModel
的实例访问the_thing
,就像在多表继承示例中一样。
答案 1 :(得分:2)
可以使用GenericForeignKeys实现:
class RelatedModel(models.Model):
content_type_of_the_thing = models.ForeignKey(ContentType)
id_of_the_thing = models.PositiveIntegerField()
the_thing = GenericForeignKey('content_type_of_the_thing', 'id_of_the_thing')
class Meta:
unique_together = ('content_type_of_the_thing', 'id_of_the_thing')
# TODO: restrict `content_type_of_the_thing` by `Submodel1 .. Submodel9` somehow
# Take into account that new submodels can appear