我创建了一个库风格的搜索表单(您可以在其中添加新行以进一步搜索,并使用 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)