2012-08-07 36 views
0

我有一个基本的Django模型和代理它的子模型。他们重写所有方法。我需要迭代基础模型的所有实例(即for i in BaseModel.objects.all()),但能够调用其相应代理类的方法,而不是在基类中声明的占位符方法。Django - 获取基本模型的实例作为相应的代理模型

我该如何解决这个问题?实际上我有一个模型字段,可以确定哪个代理模型对应于每个特定实例。也许我可以利用它并以某种方式将基类投射到子类中?我很茫然。

编辑:我看了一下this question,并设法通过写入self.__class__来改变这个类。但是,使用Django可以安全吗?

+0

我不知道我明白了...你能发表示范代码吗? – XORcist 2012-08-07 21:05:11

+0

我的情况实际上与[此问题]非常相似(http://stackoverflow.com/questions/7526088/django-model-polymorphism-with-proxy-inheritance?rq=1)。虽然我不知道我得到的模式,他们改变“自我.__ class__”的价值。 – egasimus 2012-08-07 21:15:46

回答

2
proxymodels = {"Foo": FooModel, "Bar": BarModel}  

for o in BaseModel.objects.all(): 
    proxymodels[o.type].method_name(o, *args, **kwargs) 

在代理模型(类)上调用方法,将BaseModel实例作为第一个参数加上所需的其他参数传递。这样,这些方法就像在代理模型的实例上被调用一样被调用。

PS:重新分配self .__ class__对我来说似乎非常黑客。

+0

得看看这个。 – egasimus 2012-09-06 13:26:32