1

我正在努力解决这个(希望如此)简单的问题。

我正在使用 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 不支持多表继承。)

4

2 回答 2

2

如果没有额外的 Django 插件,这是不可能的。请参阅在 django 中从父类中的对象中查找子类中的对象,其中 lazerscience 的答案建议使用https://code.google.com/p/django-polymorphic-models/来访问此功能。

于 2012-05-22T18:37:57.183 回答
1

Furbeenator 的回答是正确的,但我觉得我的(自我)回答可能对我这种情况的任何人都更有价值。

Django-nonrel包括一些不错的应用程序,值得注意的是djangotoolbox. 包含在djangotoolbox一个特定的字段中,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实例(但在我的情况下,这是一个可以接受的权衡)。

于 2012-05-23T17:43:35.857 回答