Skip to content

Commit da56898

Browse files
authored
Support optional lists (#237)
* fix: Support for Optional[list] in pydantic schemas * fix: linting rules
1 parent baea242 commit da56898

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

flask_openapi3/request.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,9 @@ def _validate_query(query: Type[BaseModel], func_kwargs: dict):
9393
model_field_schema = model_properties.get(model_field_value.alias or model_field_key)
9494
if model_field_schema.get("type") == "array":
9595
key, value = _get_list_value(query, request_args, model_field_key, model_field_value)
96+
# To handle Optional[list]
97+
elif any(m.get("type") == "array" for m in model_field_schema.get("anyOf", [])):
98+
key, value = _get_list_value(query, request_args, model_field_key, model_field_value)
9699
else:
97100
key, value = _get_value(query, request_args, model_field_key, model_field_value)
98101
if value is not None and value != []:

tests/test_request.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ class BookQuery(BaseModel):
3838
book_type: Optional[TypeEnum] = None
3939

4040

41+
class BookQueryFilter(BaseModel):
42+
age: list[int]
43+
fields: Optional[list[str]] = None
44+
45+
4146
class BookBody(BaseModel):
4247
age: int
4348

@@ -71,6 +76,13 @@ def api_query(query: BookQuery):
7176
return {"code": 0, "message": "ok"}
7277

7378

79+
@app.get("/filter-query")
80+
@decorator
81+
def api_filter_query(query: BookQueryFilter):
82+
print(query)
83+
return {"fields": query.fields, "message": "ok"}
84+
85+
7486
@app.post("/form")
7587
def api_form(form: BookForm):
7688
print(form)
@@ -111,6 +123,27 @@ def test_query(client):
111123
assert r.status_code == 200
112124

113125

126+
def test_query_list(client):
127+
r = client.get("/filter-query?age=1&fields=name&fields=age")
128+
print(r.json)
129+
assert r.status_code == 200
130+
assert r.json["fields"] == ["name", "age"]
131+
132+
133+
def test_query_list_no_fields(client):
134+
r = client.get("/filter-query?age=1")
135+
print(r.json)
136+
assert r.status_code == 200
137+
assert r.json["fields"] is None
138+
139+
140+
def test_query_list_single_field(client):
141+
r = client.get("/filter-query?age=1&fields=age")
142+
print(r.json)
143+
assert r.status_code == 200
144+
assert r.json["fields"] == ["age"]
145+
146+
114147
def test_form(client):
115148
from io import BytesIO
116149

0 commit comments

Comments
 (0)