2011-02-23 4 views
4

私はdjango-transmetaを使っています(django 1.2.5でうまくいくものは得られませんでした)以下のような:content_en、content_esは、私が持っていた国際化を実装する前にQuerySets(Python/Django)のキーワード引数を翻訳するときのeval()より良い方法

をcontent_it:

items = Items.objects.filter(categories__slug=slug) 

今category.slugは国際化であるので、私は "category.slug_en" を持って、 "category.slug_es"、 "category.slug_it"等々。

だから私はやってのいえ:

from django.db.models import Q 
from django.utils.translation import get_language 

current_lang = get_language() 

queryset = { 
    'en': Q(categories__slug_en__contains=slug), 
    'es': Q(categories__slug_es__contains=slug), 
    'it': Q(categories__slug_it__contains=slug), 
} 

items = Items.objects.filter(queryset[current_lang]) 

しかし、私はそれを行う場合、私は新しい言語を追加する必要がありますたびに、この方法で私は、私はしたくないコード、そしてもちろんを変更する必要がありますそれをする。

from django.db.models import Q 
from django.utils.translation import get_language 

current_lang = get_language() 

var = 'Q(categories__slug_%s=slug)' % current_lang 
queryset = eval(var) 
items = Items.objects.filter(queryset) 

をしかし、この場合には、私はもちろん、悪()と同義であり、それを避けるために良いだろうにeval()を使用しています:

だから私はやりました。

だから私はこれを行うより良い方法があるのだろうと思っていましたか?

ありがとうございます!

答えて

11

は、上記の回答のため

q = Q(**{"categories__slug_" + current_lang + "__contains": slug}) 
items = Items.objects.filter(q) 
+2

1を試してみてください。 pythonのdocリファレンスは次のとおりです。http://docs.python.org/reference/expressions.html#calls – RyanBrady

+1

ありがとうございます!ちょうど新しいことを学んだ:-) – nemesisdesign

関連する問題