在Django-Nonrel中正确访问OneToOneField关系中的派生类

时间:2012-05-22 18:19:55

标签: django django-models django-nonrel

我正试图解决这个(希望是)简单​​的问题。

我正在使用Django-nonrel,我正在尝试设置一些模型。我简化了下面的代码:

class Application(models.Model)
    name = "Application"

    def get_name(self):
        print(self.name)

class ExampleApp(Application)
    name = "Example Application"

class Site(models.Model)
    app = models.OneToOneField(Application, null=True)
    id  = models.CharField(max_length=1)
    # other details not important

当我获得Site的实例时,我想获得派生类的实例(例如ExampleApp

class MyView(View):
    def get(self, request, *args, **kwargs):
        # Presuppose that I have an object with id="a"
        site = Site.objects.filter(id="a")

        #<Application: Application>
        app = site.app

        #returns "Application", not "Example Application"
        app.get_name()

如何访问派生类?

(理想情况下,我希望Application是一个抽象基类,但是django不允许关系抽象基类。我会在Application中定义字段,但是django-nonrel不支持多表继承。)

2 个答案:

答案 0 :(得分:2)

如果没有额外的Django插件,这是不可能的。请参阅Find object in child class from object in parent class in django,其中lazerscience的回答建议使用https://code.google.com/p/django-polymorphic-models/来访问此功能。

答案 1 :(得分:1)

Furbeenator的回答是正确的,但我觉得我的(自我)回答对我所处的任何人都更有价值。

Django-nonrel包含一些不错的应用,值得注意的是djangotoolboxdjangotoolbox中包含特定字段EmbeddedModelField。它似乎在“容器”模型中将模型的副本存储为blob。

在我的例子中:

from djangotoolbox.fields import EmbeddedModelField

class Site(models.Model)
    app = EmbeddedModelField(null=True)
    id  = models.CharField(max_length=1)
    # other details not important

这方面的好处是,在我的情况下,这也意味着我可以让我的Application课程摘要。缺点是数据现在是重复的,我仍然无法从Site实例访问Application实例(但在我的情况下,这是一个可接受的权衡)。