是否可以在 Django 1.5.1 中将动态属性与 Q 对象一起使用?
Posted
技术标签:
【中文标题】是否可以在 Django 1.5.1 中将动态属性与 Q 对象一起使用?【英文标题】:Is it possible to use dynamic attributes with Q objects in Django 1.5.1? 【发布时间】:2013-04-13 20:48:23 【问题描述】:我正在使用django-transmeta
翻译字段,我需要使用这些翻译字段执行一些搜索。
假设我们有一个模型,其中包含一个名为translated_field
的可翻译字段。
在第一种方法中,我们可以像往常一样思考一些事情,例如:
Q(translated_field__icontains="some value") # This fails, as `translated_field` field does not exist
第二种方法是硬编码所有可能的语言版本。例如:
Q(translated_field_en__icontains="some value") # English version
Q(translated_field_es__icontains="some value") # Spanish version
# Add as many as available languages
第二个选项似乎真的是硬编码的,我想知道有没有可能的第三个选项做类似的事情:
Q(getattr("translated_field") + get_language() + "__icontains"="some value") # pseudocode
甚至更好...有没有使用 Q 对象的 **kwargs 选项?
谢谢!
【问题讨论】:
【参考方案1】:您可以动态生成查找参数名称,将其用作字典键,然后在创建 Q 对象时使用**kwargs
。
field_name_contains = "translated_field" + get_languaage() + "__icontains")
kwargs = field_name_contains: "some value"
q = Q(**kwargs)
【讨论】:
谢谢!这就是我要找的!它就像一个魅力。只是一个注释,而不是声明 varkwargs
我直接像这样传递字典:Q(**field_name_contains: "some value")
否则它会太冗长,因为有很多 elifs
:)以上是关于是否可以在 Django 1.5.1 中将动态属性与 Q 对象一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
如何覆盖 Django 的 ModelAdmin 的“媒体”属性并使其动态化?