在QuerySets中翻译关键字参数时比eval()更好的方法(Python/Django)

nem*_*ign 4 python django eval

我正在使用django-transmeta(无法通过django 1.2.5获得更好的工作),它在表中创建了几个列,如:content_en,content_es,content_it

在实施i18n之前,我有:

items = Items.objects.filter(categories__slug=slug)
Run Code Online (Sandbox Code Playgroud)

现在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])
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做,每当我需要添加一种新语言时,我将不得不更改代码,当然我不想这样做.

所以我做了:

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)
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,我使用的是eval(),它当然与evil()同义,最好避免它.

所以我想知道:有更好的方法吗?

非常感谢!

Sve*_*ach 11

尝试

q = Q(**{"categories__slug_" + current_lang + "__contains": slug})
items = Items.objects.filter(q)
Run Code Online (Sandbox Code Playgroud)

  • +1为上面的答案.这是python doc参考:http://docs.python.org/reference/expressions.html#calls (2认同)