Django OneToOneField 到多个模型 [英] Django OneToOneField to multiple models

查看:48
本文介绍了Django OneToOneField 到多个模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Suppose we have a base model:

class BaseModel(models.Model):
    pass

有一些子类:

class Submodel1(BaseModel):
    some_field = models.TextField()

...

class Submodel9(BaseModel):
    another_field = models.TextField()

每个子模型都在自己的 Django 应用程序中定义.可能会出现带有新子模型的新应用.

Each submodel is defined in its own Django app. New apps with new submodels can appear.

我们还有另一个模型,我们称之为RelatedModel,它应该与BaseModel 有一对一的关系:

We also have another model, let's call it RelatedModel, which should have a one-to-one relation to BaseModel:

class RelatedModel(models.Model):
    the_thing = models.OneToOneField(BaseModel, null=True, blank=True)

如果BaseModel.Meta.abstract == True,是否可以定义这样的关系?或者根本没有定义 BaseModel ?

Is it possible to do define such a relation if BaseModel.Meta.abstract == True? Or without defining BaseModel at all?

我在下面发布了一些解决方案作为答案,但对我来说它们看起来有点难看.

I have posted some solutions as answers below, but they seem a bit ugly to me.

推荐答案

https://stackoverflow.com/a/23547494/517316

可以将关系放在 RelatedModel 上,而不是放在 Submodel1 .. Submodel9 上.

Instead of putting the relation to RelatedModel, it is possible to put it to 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 中定义它:

Or, if we make BaseModel abstract, we can define it right in BaseModel:

class BaseModel(models.Model)
    related_model = models.OneToOneField(RelatedModel, 
                                         null=True, blank=True,
                                         related_name='the_thing')

    class Meta:
        abstract = True

这将允许使用名为 the_thing 的字段从 RelatedModel 的实例访问 SubmodelX,就像在多表继承示例中一样.

This would allow accessing SubmodelX from an instance of RelatedModel using a field named the_thing, just as in the multi-table inheritance example.

这篇关于Django OneToOneField 到多个模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆