搜索查询
概述
搜索查询定义了 Labii 应返回哪些记录。您可以在列表视图筛选、高级搜索以及支持查询输入的小插件中使用查询。
通常,查询以 URL 参数的形式编写。
查询格式
查询包含三个部分:
[field]__[expression]=value
# Example:
name__icontains=test
您可以使用 __ 将表达式串联起来。
# Convert date_start to date, then return records on/after 2022-02-01
date_start__asdate__gte=2022-02-01
查询表达式
支持的表达式包括:
- contains: 返回与提供的值匹配的结果,区分大小写。
- not_contains: 返回不与提供的值匹配的结果,区分大小写。
- icontains: 返回与提供的值匹配的结果,不区分大小写。
- not_icontains: 返回不与提供的值匹配的结果,不区分大小写。
- in: 返回在由
,分隔的提供的列表中的结果。 - jcontains: 返回与提供的值匹配的 JSON 字段的结果。
- jcontains_any: 返回与由逗号分隔的提供的值中的任意一个匹配的 JSON 字段的结果。
- not_jcontains: 返回不与提供的值匹配的 JSON 字段的结果。
- acontains: 返回 JSON 数组字段中包含逗号分隔值列表的结果。
- asimilarity: 通过将 JSON 字段与逗号分隔的输入字符串进行比较,返回相似度高于阈值的结果。
- asimilarity_65: 返回 JSON 字段与逗号分隔的输入字符串相似度超过 65% 的结果。
- asimilarity_75: 返回 JSON 字段与逗号分隔的输入字符串相似度超过 75% 的结果。
- asimilarity_85: 返回 JSON 字段与逗号分隔的输入字符串相似度超过 85% 的结果。
- asimilarity_95: 返回 JSON 字段与逗号分隔的输入字符串相似度超过 95% 的结果。
- gt: 返回大于提供的值的结果。
- gte: 返回大于或等于提供的值的结果。
- lt: 返回小于提供的值的结果。
- lte: 返回小于或等于提供的值的结果。
- int: 将数据库值转换为整数。
- asdate: 将数据库值转换为日期对象。
- asstring: 将数据库值转换为字符串。
- ne: 返回不等于提供的值的结果。
信息
在高级搜索中进行批量 ID 匹配时,请使用 In 查找表达式,并用逗号分隔值,例如:sid__in=id1,id2,id3。
多字段查询
使用 & 来组合多个条件。
name__icontains=test&is_archived=false
JSON 字段筛选
JSON 字段筛选示例:
- 包含字符串值:
jsonfield__icontains=test - 不包含字符串值:
jsonfield__not_contains=test - 包含键:
jsonfield__has_key=test - 包含对象:
jsonfield__jcontains={'name':'test'} - 不包含对象:
jsonfield__not_jcontains={'name':'test'}
通过筛选集进行筛选:
- 单个筛选集:
filter__sid=xxx - 使用 AND 组合多个筛选集:
filter__sid=xxx,xxx - 使用 OR 组合多个筛选集:
filter__sid__in=xxx,xxx
通过 JSON 查询进行筛选(结构与筛选集相同):
jquery={a:1,b:2,c=3}jquery={"or": [{sid:aa,data:bb}, {sid:aa,data:bb}]}jquery={"and": [{sid:aa,data:bb}, {sid:aa,data:bb}]}
注意
数据库 JSON 字段不再支持旧版数组格式:
["or", {sid:aa,data:bb}, {sid:aa,data:bb}]
请改用此对象格式:
{"or": [{sid:aa,data:bb}, {sid:aa,data:bb}]}
示例
-
所有未归档的实验:
{"is_archived": false, "is_locked": false} -
所有未完成的实验(至少有一个签署人未签名):
{"is_archived": false, "signer__signature__isnull": true} -
已签名但未完成的实验(至少有一个见证人未签名):
{"is_archived": false, "signer__signature__isnull": true, "is_locked": true}