我创建了一个库样式搜索表单(您可以在其中添加新行以进一步搜索,使用AND,OR,AND NOT或NOT等链接词)以允许它们在表单中构建搜索语句,然后我试图变成Q过滤器。出于某种原因,我生成的过滤器似乎返回所有内容,如果它中有OR。 (由'或在其中'我的意思是用户选择或作为他们的陈述)。
示例:我想创建一个Q过滤器,以便为其数据字段获取具有NAME的对象,并将Test作为其值,或者使用Material作为其数据字段,将Steel作为其值。
当我打印出创建的Q时,这就是我得到的:
(AND: (OR: (AND: ), (AND: ('value__icontains', 'Test'), ('represents__exact', <DataField: 3-Name>)), (NOT (AND: ('value__iexact', 'Steel'), ('represents__exact', <DataField: 6-Materials>)))))
阅读该声明,它似乎应该有效,但它不会,而且似乎只是返回所有内容。
这不完全是我所拥有的,但它是表单形状的一个示例:
更新: 我更改了我的代码,以便生成的Q语句改为:
(OR: (AND: ('value__icontains', 'er'), ('represents__exact', <DataField: 3-Name>)), (NOT (AND: ('value__iexact', 'er'), ('represents__exact', <DataField: 5-Keywords>))))
或者,以扩展形式:
(OR:
(AND:
('value__icontains', 'er'), ('represents__exact', <DataField: 3-Name>)
),
(NOT
(AND:
('value__iexact', 'er'), ('represents__exact', <DataField: 5-Keywords>)
)
)
)
但是,以下代码打印出数据库中的所有内容:
filtered = objects.filter(q)
print("Filtered: ", filtered)
答案 0 :(得分:2)
看起来像生成查询集的方式中的错误。
重新组织生成的Q
语句,看起来最外面的AND
没有第二个表达式。
(AND:
(OR:
(AND: ),
(AND:
('value__icontains', 'Test'),
('represents__exact', <DataField: 3-Name>)
),
(NOT
(AND:
('value__iexact', 'Steel'),
('represents__exact', <DataField: 6-Materials>)
)
)
)
)
空(AND: ),
也会造成问题,因此必须想办法删除空的Q
对象
P.S:这不是一个完整的答案,而是一个方向,因为如果不查看代码,可能很难弄清楚bug的确切位置。