Используйте регулярное выражение в pydantic модели, которая работает с множеством строк - PullRequest
0 голосов
/ 25 сентября 2019

Я использую пидантическую модель для представления тела запроса в fastapi.

from pydantic import BaseModel, Schema

class Files(BaseModel):
    '''Class for file URLs'''
    urls: Set[str] = Schema(..., title='Urls to files')

Это ограничит тело запроса набором URL, определенным как str.

Мне было интересно, есть ли способ дополнительно ограничить «типы» URL, отправляемых втело, используя, например, регулярные выражения.Я знаю, что Schema имеет regex флаги, но я думаю, что он будет работать только с одним входом (или, по крайней мере, он не работал с моими списками).

1 Ответ

1 голос
/ 26 сентября 2019

Вы можете использовать тип ConstrainedStr следующим образом:

import pydantic
from typing import Set
MyUrlsType =pydantic.constr(regex="^[a-z]$")
class MyForm(pydantic.BaseModel):
    urls : Set[MyUrlsType]

Он работает только при создании объекта:

MyForm(urls={"a", "B"})
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    MyForm(urls={"a", "B"})
  File "C:\Users\XXXX\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pydantic\main.py", line 275, in __init__
    values, fields_set, _ = validate_model(__pydantic_self__, data)
  File "C:\Users\XXXX\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pydantic\main.py", line 785, in validate_model
    raise err
pydantic.error_wrappers.ValidationError: 1 validation error for MyForm
urls -> 1
  string does not match regex "^[a-z]$" (type=value_error.str.regex; pattern=^[a-z]$)

Тип ConstrainedStr не применяется в методе Set add:

f = MyForm(urls={"a", "b"})
>>> <MyForm urls={'b', 'a'}>
f.urls.add("c")
f.urls.add("yolo")
f.urls
>>> {'b', 'a', 'yolo', 'c'}
...