pydantic-collections

The pydantic-collections
package provides BaseCollectionModel
class that allows you
to manipulate collections of pydantic models
(and any other types supported by pydantic).
Requirements
- Python>=3.7
- pydantic>=1.8.2,<3.0
Installation
pip install pydantic-collections
Usage
Basic usage
from datetime import datetime
from pydantic import BaseModel
from pydantic_collections import BaseCollectionModel
class User(BaseModel):
id: int
name: str
birth_date: datetime
class UserCollection(BaseCollectionModel[User]):
pass
user_data = [
{'id': 1, 'name': 'Bender', 'birth_date': '2010-04-01T12:59:59'},
{'id': 2, 'name': 'Balaganov', 'birth_date': '2020-04-01T12:59:59'},
]
users = UserCollection(user_data)
print(users)
print(users.dict())
print(users.model_dump())
print(users.json())
print(users.model_dump_json())
Strict assignment validation
By default BaseCollectionModel
has a strict assignment check
...
users = UserCollection()
users.append(User(id=1, name='Bender', birth_date=datetime.utcnow()))
users.append({'id': 1, 'name': 'Bender', 'birth_date': '2010-04-01T12:59:59'})
This behavior can be changed via Model Config
Pydantic v1.x
from pydantic_collections import BaseCollectionModel
...
class UserCollection(BaseCollectionModel[User]):
class Config:
validate_assignment_strict = False
Pydantic v2.x
from pydantic_collections import BaseCollectionModel, CollectionModelConfig
...
class UserCollection(BaseCollectionModel[User]):
model_config = CollectionModelConfig(validate_assignment_strict=False)
users = UserCollection()
users.append({'id': 1, 'name': 'Bender', 'birth_date': '2010-04-01T12:59:59'})
assert users[0].__class__ is User
assert users[0].id == 1
Using as a model field
BaseCollectionModel
is a subclass of BaseModel
, so you can use it as a model field
...
class UserContainer(BaseModel):
users: UserCollection = []
data = {
'users': [
{'id': 1, 'name': 'Bender', 'birth_date': '2010-04-01T12:59:59'},
{'id': 2, 'name': 'Balaganov', 'birth_date': '2020-04-01T12:59:59'},
]
}
container = UserContainer(**data)
container.users.append(User(...))
...