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
abstract,我们可以在 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
这将允许访问 SubmodelX
从 RelatedModel
的实例使用名为 the_thing
的字段,表继承示例。
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屋!