Django OneToOneField到多个模型

时间:2014-05-09 01:55:13

标签: django model abstract

假设我们有一个基本模型:

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

我已经发布了一些解决方案作为下面的答案,但它们对我来说似乎有点难看。

2 个答案:

答案 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