【发布时间】:2021-09-02 17:47:57
【问题描述】:
我正在使用 Django 为科学数据库构建高级搜索页面。目标是能够允许一些动态创建的复杂搜索,使用and 和or 加入搜索词组。
我通过关注this example 获得了部分成功,它允许多个术语与在一起。它基本上是一组动态创建的搜索词,我可以将它们组合在一起或组合在一起。例如
<field1|field2> <is|is not|contains|doesn't contain> <search term> <-><+>
...<-> 将删除一个搜索词行,<+> 将添加一个新行。
但我希望用户能够添加另一个搜索词行,或者添加一个 and-group 和一个 or-group,这样我就有了类似的东西:
-
<and-group|or-group> <-><field1|field2> <is|is not|contains|doesn't contain> <search term> <-><+term|+and-group|_or-group>
然后用户可以添加术语或组。结果搜索可能最终如下:
-
and-group-
compoundislysine -
or-group-
tissueisbrain -
tissueisspleen
-
-
feeding statusis notfasted
-
因此生成的过滤器将如下所示。
Data.objects.filter(Q(compound="lysine") & (Q(tissue=brain) | Q(tissue="spleen")) & ~Q(feeding_status="fasted"))
注意 - 我不一定要问如何使下面的过滤器表达式正确 - 这只是我试图弄清楚的动态分层构造组件。如果我得到了Q 和/或 filter 语法错误。我以前做过这些查询,但我对 Django 还是陌生的,所以在这里把它从我的脑海中浮现出来几乎可以保证是零机会。我也跳过了我在这里跨越的模型关系,所以为了简单起见,我们假设这些都是同一个模型中的所有字段。
我不确定如何为过滤器表达式动态添加括号,但我当前的代码可以轻松地将单个 Q 表达式与 and 或 or 连接起来。
我也不确定如何动态创建分层表单来创建子组。我猜任何这样的解决方案都必须是一个黑客,并且没有建立机制来做这样的事情......
这是我目前正在工作的截图示例:
更新:
我找到了this example,我已经走了很远。在将它合并到我的 Django 项目之前,我分叉了那个小提琴并得到了这个概念证明:
http://jsfiddle.net/hepcat72/d42k38j1/18/
控制台准确地吐出我想要的对象。并且没有错误。单击搜索按钮可用于表单验证。我留空的任何字段都会提示填写该字段。这是一个演示 gif:
现在我需要处理 POST 输入以构造查询(我认为我可以处理)并恢复结果上方的表单 - 我不太确定如何完成 - 可能是自定义标记中的递归函数?
尽管如此,有没有办法对表单进行快照并在结果加载到下方时恢复它?或者可能将结果加载到不同的框架中?
【问题讨论】: