2012-05-29 50 views
-1

我想要的是使字符串var可調用。我只是擁有不同models_names的列表,我想以這種方式調用它們的創建方法。如何使str var可調用

class Object_model_a: 
    #def ... 
class Object_model_b: 
    #def ... 
class Object_model_c: 
    #def ... 

list = ('Object_model_a', 'Object_model_b', 'Object_model_c') 
x = list[0]() # this must create a new instance of Object_model_a 

這是可能使用PHP這樣的方式來開發:

$hi = 'Hello' 
$Hello = 'Hi!!' 
echo $$hi 
>> Hi!! 

任何人都知道,如果這使用Django的可能嗎?這將簡化我的代碼。

非常感謝!

+1

不,這不會簡化您的代碼。改用[Factory](http://en.wikipedia.org/wiki/Factory_method_pattern)。 – DrTyrsa

+1

「我想要的是讓一個字符串var callable」不,你不。 – Marcin

+0

什麼讓你不把它們存儲在列表中?例如[Object_model_a,Object_model_b]等 – devsnd

回答

4

您可以使用Django的get_model輔助函數,該函數接受應用程序名稱和模型名稱並返回模型類。

from django.db.models import get_model 

list = ('Object_model_a', 'Object_model_b', 'Object_model_c') 
model = get_model('my_app_name', list[0]) # returns Object_model_a class 
instance = model() # creates a model instance 
0

如果因任何原因,你有代表特定類的字符串,正確的方法使用該實例化一個對象的這個類是類放在一個dict,由字符串鍵,然後就調用該類。

classes = dict((c.__name__, c) for c in (Object_model_a, Object_model_b, Object_model_c)) 

instance = classes['Object_model_a']() 

顯然,您不需要使用類名作爲鍵。

+0

你能否也請指出這是一個多麼恐怖的想法? – devsnd

+0

@twall好吧,如果你確實需要按字符串選擇類,這是正確的做法。這偶爾有用。 – Marcin

+1

@twall:爲什麼「可怕的可怕」?這是一個非常常見的Python成語。 –

-1

感謝您的所有意見,這是我解決這一要求的方式。

def create_object_instance(model_name, id=None): 
    for model in get_models(): 
     if str(model.__name__).lower() == str(model_name).lower(): 
      if id: 
       try: 
        return model.objects.get(id=id)    
       except ObjectsDoesNotExist: 
        return None 
      else: 
       return model.objects.all() 
    return None 
+1

這有點可怕。如果你想允許指定一個任意模型,爲什麼不使用'get_model'? – Marcin