2012-08-07 34 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