2012-01-18 11 views
1

私は次のように似て働き、その種類に基づいてオブジェクトをルックアップするためにはDjangoに機能を書かれている:ID 14Pythonで文字列をPythonコードとして解釈させるにはどうすればよいですか?

とコースのオブジェクトがある場合

def lookup(modelType, item_id): 
    try: 
     return eval(modelType).objects.get(pk=item_id) 
    except ObjectDoesNotExist: 
     return None 

lookup(Course, 14)Course.objects.get(pk=14)を返す必要がありますこの機能は書くのが実現可能ですか?ありがとうございました。

+0

あなたの質問をする前にこれを試していないですか? evalは落胆していますが、これはうまくいきました。 – Marcin

+0

@Marcin:しかし、 'lookup(Course、14)'コードでは動作しません。 –

+0

@ S.Lott:かなり。 – Marcin

答えて

4

lookup(Course, 14)を使用する場合は、この操作を行います。

def lookup(the_model, item_id): 
    try: 
     the_model.objects.get(pk=item_id) 
    except the_model.DoesNotExist: 
     return None 

書いた関数を使い続けたい場合は、モデルを文字列として渡す必要があります。また

lookup("Course", 14)

return Noneは非常に悪い考えです。例外を適切に使用する方が通常ははるかに優れています。

+0

ありがとう!例外を正しく使用することはどういう意味ですか? – dangerChihuahua007

+1

eval(modelType)は例外を飲み込むよりもはるかに悪い考えです。文字列を要求すると、呼び出し元がパラメータを十分に制御できないことがわかります。その場合、evalはおそらく最悪のことです。私が例外処理について変更する唯一のものは、例外に対して 'pass'することです。暗黙的に' None'を返すようにしてください(または例外に言及して伝播させないようにしてください)。 –

+0

@IanClelland: "Requiring文字列は、呼び出し側がパラメータを多く制御できないことを示しています。全く真実ではない。それはかなり安全な設定ファイルから来る可能性があります。 –

2

エバール(またはエグゼクティブ)は、この種の用途ではあまりにも危険です。モデルと文字列の間のマッピングを作成する方がよいでしょう。たとえば:

from school.models import Student, Teacher 

model_mapping = {'student': Student, 
       'teacher': Teacher} 

文字列が与えられた場合、あなたが行うことができます:

string_of_a_model = 'student' 
model_mapping[string_of_a_model].objects.all()