-1

私が欲しいのは、文字列変数を呼び出し可能にすることです。私はさまざまな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を使用してこれが可能かどうかは誰にもわかりますか?? これにより、私のコードが大幅に簡素化されます。

どうもありがとう!

4

3 に答える 3

4

get_modelアプリ名とモデル名を受け取り、モデル クラスを返すDjango のヘルパー関数を使用できます。

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
于 2012-05-29T11:51:14.097 に答える
0

なんらかの理由で特定のクラスを表す文字列がある場合、それを使用してそのクラスのオブジェクトをインスタンス化する正しい方法はdict、文字列をキーとしてクラスを に配置し、クラスを呼び出すだけです。

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

instance = classes['Object_model_a']()

明らかに、クラス名をキーとして使用する必要はありません。

于 2012-05-29T11:55:45.327 に答える
-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
于 2012-05-30T08:07:03.527 に答える