如何使str var可调用

时间:2012-05-29 11:44:07

标签: django models var callable

我想要的是使字符串var可调用。我只有一个包含不同models_names的列表,我想以这种方式调用它们的创建方法。

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是否可行?这将简化我的代码。

非常感谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果由于某种原因你有一个表示特定类的字符串,那么使用它来实例化该类对象的正确方法是将类放在dict中,由字符串键入,然后只是调用该类。

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

instance = classes['Object_model_a']()

显然,您不需要使用classname作为密钥。

答案 2 :(得分:-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