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

查看:127
本文介绍了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 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屋!

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