URL查询参数OR逻辑使用规范及URI条件改写实现咨询
URL查询参数中OR逻辑的通用惯例与实现方案
一、通用惯例
URL查询参数的OR逻辑没有绝对统一的行业标准,但有几种被广泛采用的实践方式:
- 重复参数名:通过重复同一个参数名传递多个OR条件,比如
non_null_field=date_debut&non_null_field=deadline,后端将参数解析为数组,对应date_debut IS NOT NULL OR deadline IS NOT NULL的查询逻辑。 - 自定义分隔符:用单个参数承载多个条件,通过
|、,这类分隔符区分,比如filter=date_debut:notnull|deadline:notnull,后端解析时拆分条件并转换为OR逻辑。 - 显式OR参数:定义专门的参数存放OR条件,比如
or_conditions=date_debut:notnull,deadline:notnull,后端读取该参数后生成对应的OR查询语句。 - 直接使用运算符(不推荐):虽然可以用
||表示OR,但需要URL编码为%7C%7C,比如date_debut=notnull%7C%7Cdeadline=notnull,这种方式可读性差,且多数后端框架无法直接解析,很少被使用。
二、针对你的场景的实现方案
你的原始URI是:
example.com/api/records/?mode=timeline&ordering=-date_debut&page_size=50&date_debut=notnull&deadline=notnull
要实现「date_debut或deadline任一字段为notnull即返回数据」,推荐以下几种修改方式:
方案1:重复参数名(可读性最佳)
调整为:
example.com/api/records/?mode=timeline&ordering=-date_debut&page_size=50&non_null_field=date_debut&non_null_field=deadline
后端需要将non_null_field解析为数组参数,然后在查询时生成date_debut IS NOT NULL OR deadline IS NOT NULL的条件。
方案2:自定义过滤参数
调整为:
example.com/api/records/?mode=timeline&ordering=-date_debut&page_size=50&filter=date_debut:notnull|deadline:notnull
后端解析filter参数,按|拆分得到两个条件,再转换为OR逻辑执行查询。
方案3:显式OR条件参数
调整为:
example.com/api/records/?mode=timeline&ordering=-date_debut&page_size=50&or_conditions=date_debut:notnull,deadline:notnull
后端读取or_conditions参数,按逗号拆分条件后处理为OR查询。
注意:具体选择哪种方案,需要结合你的后端框架能力——比如使用Django REST Framework时,可以借助django-filter库快速实现重复参数或自定义过滤器的解析;如果是自定义后端服务,则需要自行编写参数解析逻辑。
内容的提问来源于stack exchange,提问作者Arka-cell
相关产品推荐
相关产品推荐

