第 6 章 在 API 中过滤
系统将集合识别为 "queryset"。您可以使用各种 operator 来过滤它。
流程
要查找包含名称 "foo" 的组,请使用:
http://<controller server name>/api/v2/groups/?name__contains=foo
http://<controller server name>/api/v2/groups/?name__contains=fooCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要查找准确的匹配项,请使用:
http://<controller server name>/api/v2/groups/?name=foo
http://<controller server name>/api/v2/groups/?name=fooCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果资源是整数类型,您必须将
\_\_int添加到结尾,以将字符串输入值转换为整数,如下所示:http://<controller server name>/api/v2/arbitrary_resource/?x__int=5
http://<controller server name>/api/v2/arbitrary_resource/?x__int=5Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以使用以下方法查询相关资源:
http://<controller server name>/api/v2/users/?first_name__icontains=kim
http://<controller server name>/api/v2/users/?first_name__icontains=kimCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这会返回包含字符串"Kim"的名称的所有用户。
您还可以一次过滤多个字段:
http://<controller server name>/api/v2/groups/?name__icontains=test&has_active_failures=false
http://<controller server name>/api/v2/groups/?name__icontains=test&has_active_failures=falseCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这将找到所有包含名称"test"的组,但没有活跃故障。
其他资源
有关可用的运算符类型的更多信息,请参阅 QuerySet API 参考。
您还可以监视 API,因为 UI 被用来查看如何过滤各种条件。
6.1. API 中的高级查询 复制链接链接已复制到粘贴板!
您可以使用额外的查询字符串参数来过滤返回到与给定值匹配的结果列表。您只能使用数据库中存在的字段和关系进行过滤。确保指定的值中的任何特殊字符都是 URL 编码的。例如:
?field=value%20xyz
?field=value%20xyz
字段也可以跨越关系,仅适用于数据库中定义的字段和关系:
?other__field=value
?other__field=value
要排除与特定条件匹配的结果,请为 field 参数添加 no __ 前缀:
?not__field=value
?not__field=value
默认情况下,所有查询字符串过滤器都是 AND,因此仅返回与所有过滤器匹配的结果。要组合与多个条件中的任何一个匹配的结果,请为每个查询字符串参数添加前缀 or__ :
?or__field=value&or__field=othervalue ?or__not__field=value&or__field=othervalue
?or__field=value&or__field=othervalue
?or__not__field=value&or__field=othervalue
默认 AND 过滤同时应用于跨数据库关系过滤的每个相关对象。链过滤器会为每个相关对象单独应用过滤器。要使用它,请为查询字符串参数添加 chain__ 前缀:
?chain__related__field=value&chain__related__field2=othervalue ?chain__not__related__field=value&chain__related__field2=othervalue
?chain__related__field=value&chain__related__field2=othervalue
?chain__not__related__field=value&chain__related__field2=othervalue
如果您将第一个查询写为 ?relatedfield=value&relatedfield2=othervalue,它只会返回同时满足这两个条件的主对象。如使用链过滤器编写,它将返回与每个条件匹配的主对象的交集。