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

标签 python django eval

我正在使用 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(),这当然是 evil() 的同义词,最好避免使用它。

所以我想知道:是否有更好的方法来做到这一点?

非常感谢!

最佳答案

尝试

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

关于python - 在 QuerySets (Python/Django) 中翻译关键字参数时比 eval() 更好的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5092336/

相关文章:

python - VS Code 中的运行按钮不显示 [Python]

python - 如何使用列表理解构建字典?

python - 将多层嵌套 json 展平为 pandas 数据框

python - Django 抽象与非抽象模型继承

Django:为什么控制台电子邮件后端不发送电子邮件?

javascript - Node.js 上的 WebSocket 并在所有连接的客户端之间共享消息

python - 尽管 gce.py 有效,但 Ansible 中的 GCE 模块找不到 apache-libcloud

Django CMS 反向管理

python - 如何执行存储为字符串的 bool 逻辑,最好不使用 eval()?

clojure - 我可以不使用 eval 来编写这个宏吗?