我正试图解决这个(希望是)简单的问题。
我正在使用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不支持多表继承。)
答案 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
包含一些不错的应用,值得注意的是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
实例(但在我的情况下,这是一个可接受的权衡)。