Django 如何使str变量可调用

Django 如何使str变量可调用,django,models,var,callable,Django,Models,Var,Callable,我想要的是使字符串变量可调用。我只是有一个不同模型名称的列表,我想这样调用它们的create方法 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 crea

我想要的是使字符串变量可调用。我只是有一个不同模型名称的列表,我想这样调用它们的create方法

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是否可以做到这一点吗??这将大大简化我的代码

非常感谢

可以使用Django的get_model helper函数,该函数接受应用程序名和模型名并返回模型类

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

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

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

instance = classes['Object_model_a']()

显然,您不需要使用类名作为键。

谢谢您的评论,这就是我解决此需求的方法

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

不,这不会简化您的代码。我想要的是使字符串变量可调用不,你不可以。是什么阻止你将类存储在列表中?e、 g.[Object\u model\u a,Object\u model\u b]等等。我之所以要这么做,是因为我永远不知道这个脚本将管理的模型类型,在未来的开发中,它将能够获得关于任何其他模型的信息。你能指出这是一个多么可怕的想法吗?@twall-Well,如果确实需要按字符串选择类,这是正确的方法。这有时是有用的。@twall:为什么可怕得可怕?这是一个非常常见的Python习语,有点可怕。如果您想允许指定任意模型,为什么不使用get\u模型呢?