是否可以在 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)

【讨论】:

谢谢!这就是我要找的!它就像一个魅力。只是一个注释,而不是声明 var kwargs 我直接像这样传递字典:Q(**field_name_contains: "some value") 否则它会太冗长,因为有很多 elifs :)

以上是关于是否可以在 Django 1.5.1 中将动态属性与 Q 对象一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

在django中将动态变量从父模板传递给子模板

在 django 视图中将表单字段作为属性访问

将属性动态添加到 django 模型

如何覆盖 Django 的 ModelAdmin 的“媒体”属性并使其动态化?

在 Django 中将 cache.clear() 添加到全局保存

在 django 中将两个字段相乘