使用带有变量的 Q 对象

Posted

技术标签:

【中文标题】使用带有变量的 Q 对象【英文标题】:Using Q object with variable 【发布时间】:2021-01-14 06:10:36 【问题描述】:

我想以查询词来自变量的方式使用 django.db.models.Q 对象。

我想要实现的与此相同:

q = Q(some_field__icontains='sth')
Obj.objects.filter(q)

,但是 some_field 的值应该来自一个变量:

field_name='some_field'
q = Q('%s__icontains=sth' % field_name)
Obj.objects.filter(q)

,但是这个解决方案当然不会给我正确的结果。

我也尝试过这样使用字典:

dt = '%s__icontains' % field_name: 'sth'
q = Q(**dt)
Obj.objects.filter(q)

,但这在结果上也失败了。

如何使用 Q 对象将变量用作查询词?

谢谢。

【问题讨论】:

“结果失败”是什么意思? 它没有返回正确的(预期的)结果数。实际上它的结果是 0。 你确定field_namesome_field 吗?如果您与另一个 field_name 合作,结果当然会有所不同。 【参考方案1】:

您可以将 2 元组传递给 Q 对象,其中字段名称和查找的名称作为第一项,值作为第二项:

Obj.objects.filter(<b>Q(('%s__icontains' % field_name, 'sth'))</b>)

这可能是最方便的方式。话虽这么说,字典解包虽然不那么优雅,但也应该可以工作。

【讨论】:

不幸的是,字典方式不起作用,但您的解决方案可以!谢谢。 我很惊讶Obj.objects.filter(Q(**dt)) 不起作用,但为什么呢? ??

以上是关于使用带有变量的 Q 对象的主要内容,如果未能解决你的问题,请参考以下文章

带有 Q 对象的查询集的 Django 优化

将关键字存储在查询集中,在结果查询集中提供带有 Q 对象的搜索命中以及搜索结果

带有 Q 对象的 Django 查询?

如何使用 json 序列化将带有其他变量的对象发送回客户端?

BOM

使用 NSPredicate 解析带有变量的公式