基于问题和答案here,我能够弄清楚如何使用map / reduce和lambda表达式在mongo引擎中动态构建复杂查询。
然而,由于我试图将我的OR查询切换为AND查询,我遇到了麻烦(具有讽刺意味的是,上面问题的海报在他的初步问题得到解答后也是如此)。
这是我正在运行的代码:
titles = ['topic1', 'topic2', 'topic3']
query = reduce(lambda q1, q2: q1.__and__(q2),
map(lambda the_title: Q(slug__iexact=the_title), titles))
threats = Threat.objects.filter(query)
当我这样做时,我收到以下错误:
InvalidQueryError: Duplicate query conditions: slug__iexact
但是,当我运行相同的代码,但用__and__
代替__or__
时,查询效果非常好。
一如既往,我不是专家,而且在我走的时候正在搞清楚事情,所以我可能会遗漏一些明显的东西。非常感谢此处的任何想法。
答案 0 :(得分:0)
因为此查询将始终为False或仅重复:
Q(slug__iexact='topic1') and Q(slug__iexact='topic2') <==> False
Q(slug__iexact='topic1') and Q(slug__iexact='topic1') <==> Q(slug__iexact='topic1')
但看起来像重复被忽略:ops = set(query.keys())
,所以这个查询没有意义。
您必须捕获此异常并从过滤器中删除此查询,因为它没有意义。