[英]Django Q filter not working as expected
我创建了一个库样式搜索表单(您可以在其中添加新行,并通过链接AND,OR,AND NOT,OR 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)
看起来像是生成查询集的方式中的错误。
重新组织生成的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
对象
PS:这不是一个完整的答案,而是一个方向,因为如果不看代码,可能很难弄清楚错误的确切位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.