Pydantic model support for Django ORM
Project description
Pydantic-Django
An attempt to implement a Pydantic model interface for Django ORM. The goal of this project is to support all of Pydantic's features to provide as many (useful) conveniences for Django models as possible.
Important: this project should be considered an experimental work-in-progress. The current API design and behaviour is not finalised, specific version support is not yet determined, and there is still a lot of things to test yet.
Also, I typically haven't used metaclasses/classes like this previously, so there may be some details in the implementation to refine.
Seems to work okay so far. :)
Installation
pip install pydantic-django
Usage
Requirements: Python 3.7+, Django 3
An example of basic serialization case:
from users.models import User
from pydantic_django import PydanticDjangoModel
class PydanticUser(PydanticDjangoModel):
"""An example user schema."""
class Config:
model = User
schema = PydanticUser.schema()
A schema call would return something like this:
{
'description': 'An example user schema.',
'properties': {
'created_at': {'format': 'date-time', 'title': 'Created At', 'type': 'string'},
'email': {'maxLength': 254, 'title': 'Email', 'type': 'string'},
'first_name': {'maxLength': 50, 'title': 'First Name', 'type': 'string'},
'groups': {'items': {'type': 'integer'}, 'title': 'Id', 'type': 'array'},
'id': {'title': 'Id', 'type': 'integer'},
'last_name': {'maxLength': 50, 'title': 'Last Name', 'type': 'string'},
'messages': {'items': {'type': 'integer'}, 'title': 'Id', 'type': 'array'},
'profile': {'title': 'Id', 'type': 'integer'},
'updated_at': {'format': 'date-time', 'title': 'Updated At', 'type': 'string'},
},
'required': ['first_name', 'email', 'created_at', 'updated_at', 'groups'],
'title': 'PydanticUser',
'type': 'object',
}
There are a few ways to populate the models with values, the first is using the from_django
method:
user = User.objects.create(
first_name="Jordan", last_name="Eremieff", email="jordan@eremieff.com"
)
pydantic_user = PydanticUser.from_django(user)
Alternatively, the Pydantic model can be used to create a new object:
pydantic_user = PydanticUser.create(first_name="Jordan", last_name="Eremieff", email="jordan@eremieff.com")
Or retrieve an existing one:
pydantic_user = PydanticUser.get(id=user.id)
The object in each case can be validated and export the values in the same way:
user_json = pydantic_user.json()
To produce a result such as:
{"profile": null, "messages": [], "id": 1, "first_name": "Jordan", "last_name": "Eremieff", "email": "jordan@eremieff.com", "created_at": "2020-08-09T13:45:04.395787+00:00",
"updated_at": "2020-08-09T13:45:04.395828+00:00", "groups": []}
It can do a bit more than this, but you'll have to check out the testing application and test cases as a reference for now.
Roadmap
- Automatic schema generation from Django models
- Basic queryset interface for CRUD operations
- Include & exclude field filtering
- Default factory support
- Support basic field types
- Sub-model support for forward and reverse relations
- Postgres field types
- Support for multi-object querysets
- More comprehensive support for Django features
- HTML schema generation
- Create a complete application example
- Look into performance & benchmarking
- More test coverage & type annotations
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file pydantic-django-0.0.1.tar.gz
.
File metadata
- Download URL: pydantic-django-0.0.1.tar.gz
- Upload date:
- Size: 12.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/39.0.1 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.7.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 76eb63ba85b44dc1bbb18c84a9392fbad4ecccefe00478c55a00c4ea8c5e901c |
|
MD5 | 71978ac9b63cc394245e34fbe02ba252 |
|
BLAKE2b-256 | 24810314fafc66375a897f89f3217fca2f36f5b33345a90afeebe0c97ba2fa7e |