Лучший способ, чем eval () при переводе аргументов ключевых слов в QuerySets (Python / Django) - PullRequest
4 голосов
/ 23 февраля 2011

Я использую django-transmeta (больше ничего не получалось, работая лучше с django 1.2.5), который создает несколько столбцов в таблице, например: content_en, content_es, content_it

До внедрения i18n у меня было:

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 (), который, конечно, синонимичен злу (), и было бы лучше его избежать.

Так что мне было интересно: есть ли лучший способ сделать это?

Большое спасибо!

1 Ответ

11 голосов
/ 23 февраля 2011

Попробуйте

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