查询参数 (Query)

声明和获取查询参数需要使用 django_oasis.parameter.Query,它的使用方法如下:

views.py [示例1]
from django_oasis import schema
from django_oasis.core import Resource
from django_oasis.parameter import Query


# 定义所需的参数结构
# 这里定义了 2 个参数 a, b
class QuerySchema(schema.Model):
    a = schema.String()
    b = schema.Integer()


@Resource("/to/path")
class API:
    def get(
        self,
        query=Query(QuerySchema),  # 以关键字参数的形式设置在请求操作函数中
    ): ...

如示例所见,查询参数的声明由2部分组成:

  • QuerySchema 是一个 Schema 类,它用于定义请求参数名、数据类型等,并且为实际的请求参数执行反序列化及验证。有关 Schema 的详细说明请查看 相应章节

  • Query 用于声明请求参数位于 “查询参数” 中。

最终 get 方法获取的 query 参数值为 QuerySchema 对请求参数反序列化后得到的值。

在此示例中,如果查询参数为 ?a=1&b=2,则 query = {"a": "1", "b": 2}

SwaggerUI [示例1]

简洁写法

在声明请求参数时,可以使用字典代替 Schema,这样写起来更加简洁。如下代码等同于上面的示例。

@Resource("/to/path")
class API:
    def get(
        self,
        query=Query({
            'a': schema.String(),
            'b': schema.Integer()
        }),
    ): ...

备注

实际上,在使用字典代替 Schema 时,Query 内部调用了 Model.from_dict 方法。

分组声明

如果需要对参数获取进行分组处理,可以使用分组声明的方式。

views.py [示例2]
from django_oasis import schema
from django_oasis.core import Resource
from django_oasis.parameter import Query


@Resource("/to/path")
class API:
    def get(
        self,
        q1=Query({"a": schema.String(), "b": schema.String()}),
        q2=Query({"c": schema.String()}),
    ): ...

q1q2 将查询参数拆分为了两组。

如查询参数为 ?a=1&b=2&c=3,则 q1 = {"a": "1", "b": "2"} q2 = {"c": "3"}

SwaggerUI [示例2]

单参数项声明

如果仅需要对单个参数项进行声明,使用 django_oasis.parameter.QueryItem

views.py [示例3]
from django_oasis import schema
from django_oasis.core import Resource
from django_oasis.parameter import QueryItem


@Resource("/to/path")
class API:
    def get(
        self,
        a=QueryItem(schema.Integer),
        b=QueryItem(schema.Integer(default=0)),
    ): ...

备注

QueryItem 本身并不参与实际功能,它只是被转换为了 Query 的形式。所以上面代码等效于:

@Resource("/to/path")
class API:
    def get(self, query=Query({
        "a": schema.Integer(),
        "b": schema.Integer(default=0),
    })): ...
SwaggerUI [示例3]

参数样式查询表

数组样式

以下示例的参数结果示例 color = ["blue", "black", "brown"]

color=blue&color=black&color=brown (default)

views.py [示例4]
@Resource("/array/form/true")
class ArrayFormTrueAPI:
    def get(
        self,
        color=QueryItem(
            schema.List(schema.String()),
            Style("form", True),
        ),
    ):
        ...

color=blue,black,brown

views.py [示例4]
@Resource("/array/form/false")
class ArrayFormFalseAPI:
    def get(
        self,
        color=QueryItem(
            schema.List(schema.String()),
            Style("form", False),
        ),
    ):
        ...

color=blue black brown

views.py [示例4]
@Resource("/array/spaceDelimited/false")
class ArraySpaceDelimitedFalseAPI:
    def get(
        self,
        color=QueryItem(
            schema.List(schema.String()),
            Style("spaceDelimited", False),
        ),
    ):
        ...

color=blue|black|brown

views.py [示例4]
@Resource("/array/pipeDelimited/false")
class ArrayPipeDelimitedFalseAPI:
    def get(
        self,
        color=QueryItem(
            schema.List(schema.String()),
            Style("pipeDelimited", False),
        ),
    ):
        ...

对象样式

以下示例的参数结果示例 color = {"R": 100, "G": 200, "B": 500}

R=100&G=200&B=150 (default)

views.py [示例4]
@Resource("/object/form/true")
class ObjectFormTrueAPI:
    def get(
        self,
        color=QueryItem(
            schema.Model.from_dict(
                {
                    "R": schema.Integer(),
                    "G": schema.Integer(),
                    "B": schema.Integer(),
                }
            ),
            Style("form", True),
        ),
    ):
        ...

color=R,100,G,200,B,150

views.py [示例4]
@Resource("/object/form/false")
class ObjectFormFalseAPI:
    def get(
        self,
        color=QueryItem(
            schema.Model.from_dict(
                {
                    "R": schema.Integer(),
                    "G": schema.Integer(),
                    "B": schema.Integer(),
                }
            ),
            Style("form", False),
        ),
    ):
        ...

color[R]=100&color[G]=200&color[B]=150

views.py [示例4]
@Resource("/object/deepObject/true")
class ObjectDeepObjectTrueAPI:
    def get(
        self,
        color=QueryItem(
            schema.Model.from_dict(
                {
                    "R": schema.Integer(),
                    "G": schema.Integer(),
                    "B": schema.Integer(),
                }
            ),
            Style("deepObject", True),
        ),
    ):
        ...
SwaggerUI [示例4]