from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel
class User(BaseModel):
id: int
name = 'John Doe'
signup_ts: Optional[datetime] = None
friends: List[int] = []
external_data = {
'id': '123',
'signup_ts': '2019-06-01 12:22',
'friends': [1, 2, '3'],
}
user = User(**external_data)
print(user.id)
#> 123
print(repr(user.signup_ts))
#> datetime.datetime(2019, 6, 1, 12, 22)
print(user.friends)
#> [1, 2, 3]
print(user.dict())
"""
{
'id': 123,
'signup_ts': datetime.datetime(2019, 6, 1, 12, 22),
'friends': [1, 2, 3],
'name': 'John Doe',
}
"""
from pydantic import ValidationError
try:
User(signup_ts='broken', friends=[1, 2, 'not number'])
except ValidationError as e:
print(e.json())
[
{
"loc": [
"id"
],
"msg": "field required",
"type": "value_error.missing"
},
{
"loc": [
"signup_ts"
],
"msg": "invalid datetime format",
"type": "value_error.datetime"
},
{
"loc": [
"friends",
2
],
"msg": "value is not a valid integer",
"type": "type_error.integer"
}
]
from pydantic import BaseModel
class Person(BaseModel):
name: str
age: int
email: str
invalid_data = {
'name': 'Alice',
'age': 'thirty',
'email': 'alice@example.com'
}
try:
person = Person(**invalid_data)
except ValueError as e:
print(e)
validator
데코레이터를 이용하여, 필드 유효성 검사 규칙을 정의할 수 있다.from pydantic import validator
class Person(BaseModel):
name: str
age: int
email: str
@validator('age')
def check_age(cls, v):
if v < 0 or v > 150:
raise ValueError('Age must be between 0 and 150')
return v
from typing import List, Optional
from pydantic import BaseModel
class Foo(BaseModel):
count: int
size: Optional[float] = None
class Bar(BaseModel):
apple = 'x'
banana = 'y'
class Spam(BaseModel):
foo: Foo
bars: List[Bar]
m = Spam(foo={'count': 4}, bars=[{'apple': 'x1'}, {'apple': 'x2'}])
print(m)
#> foo=Foo(count=4, size=None) bars=[Bar(apple='x1', banana='y'),
#> Bar(apple='x2', banana='y')]
print(m.dict())
"""
{
'foo': {'count': 4, 'size': None},
'bars': [
{'apple': 'x1', 'banana': 'y'},
{'apple': 'x2', 'banana': 'y'},
],
}
"""
from pydantic import BaseModel, ValidationError, validator
class UserModel(BaseModel):
name: str
username: str
password1: str
password2: str
@validator('name')
def name_must_contain_space(cls, v):
if ' ' not in v:
raise ValueError('must contain a space')
return v.title()
@validator('password2')
def passwords_match(cls, v, values, **kwargs):
if 'password1' in values and v != values['password1']:
raise ValueError('passwords do not match')
return v
@validator('username')
def username_alphanumeric(cls, v):
assert v.isalnum(), 'must be alphanumeric'
return v
user = UserModel(
name='samuel colvin',
username='scolvin',
password1='zxcvbn',
password2='zxcvbn',
)
print(user)
#> name='Samuel Colvin' username='scolvin' password1='zxcvbn' password2='zxcvbn'
try:
UserModel(
name='samuel',
username='scolvin',
password1='zxcvbn',
password2='zxcvbn2',
)
except ValidationError as e:
print(e)
"""
2 validation errors for UserModel
name
must contain a space (type=value_error)
password2
passwords do not match (type=value_error)
"""
from pydantic import BaseModel
class Person(BaseModel):
name: str
age: int
email: str
json_str = """
{
"name": "Alice",
"age": 30,
"email": "alice@example.com"
}
"""
person = Person.parse_raw(json_str)
print(person)
parse_raw()
메소드는 데이터를 파싱하여 Python 객체로 변환하는 역할을 합니다.parse_obj 메서드는 pydantic 모델 클래스의 인스턴스를 생성할 때 사용
이 메서드는 딕셔너리와 같은 객체를 인수로 받아서, 해당 객체를 사용하여 pydantic 모델 클래스의 새로운 인스턴스를 만듭니다.
parse_obj 메서드는 일반적으로 dict나 JSON과 같은 문자열에서 파싱된 데이터를 pydantic 모델 인스턴스로 변환하는 데 사용
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str
data = {"id": 123, "name": "John Doe"}
user = User.parse_obj(data)
__fields__
class BaseModel(pydantic.BaseModel):
def __init__(self, **data: Any):
flags_like = data.pop("flags_like", None)
if flags_like:
for name, field in self.__fields__.items():
__fields__
에 대해 알아보자.