姜戈。 Q 对象动态生成

Posted

技术标签:

【中文标题】姜戈。 Q 对象动态生成【英文标题】:Django. Q objects dynamicaly generate 【发布时间】:2017-10-02 03:32:49 【问题描述】:

模型字段有一个过滤器

queryset = queryset.filter(
            Q(title__icontains=search_text) |
            Q(description__icontains=search_text) |
            Q(name_icontains=search_text)
        )

如何根据情况生成块

Q(title__icontains=search_text) | Q(description__icontains=search_text)| Q(name_icontains=search_text)

例如,在一种情况下,过滤器必须是这样的

Q(description__icontains=search_text) | Q(name_icontains=search_text)

Q(title__icontains=search_text) | Q(description__icontains=search_text) |

Q(title__icontains=search_text)

我可以使用字典生成 Q 对象 例如

search_text = 'somthing text'
fields_name = ['title', 'description', 'name']

 queries = [ Q(**field+'__icontains': search_text) for field in fields_name]  

但这是怎么回事

[<Q: (AND: ('title__icontains': 'first'))>, <Q: (AND: ('description__icontains': 'first'))>, <Q: (AND: ('name__icontains': 'first'))>]

粘贴到过滤器并使用 OR 分隔符

【问题讨论】:

你需要所谓的parse tree 【参考方案1】:

你可以的

>>>[Q(**field +'__contains': search_text) for field in fields_name]

现在如果你想做一个OR

>>>import operator
>>>reduce(operator.or_, [Q(**field+'__contains': search_text) for field in fields_name])

与此相同

Q(title__icontains=search_text) |
Q(description__icontains=search_text)|
Q(name_icontains=search_text)

【讨论】:

谢谢。固定问题。 这就是我需要的

以上是关于姜戈。 Q 对象动态生成的主要内容,如果未能解决你的问题,请参考以下文章

WPF 动态生成对象属性 (dynamic)

利用runtime动态生成对象?

Cglib根据数据库表数据动态生成对象

DataGridViewComboBoxColumn这个东西,要怎样动态生成,动态绑定数据呢???真的好郁闷,狗一样的微软

JDK动态代理,动态生成代理类。

JS 动态生成JSON对象