Django OneToOneField 到多个模型 [英] Django OneToOneField to multiple models
问题描述
假设我们有一个基本模型:
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屋!