Use pydantic with Django REST framework
Pydantic is a Python library used to perform data serialization and validation.
Django REST framework is a framework built on top of Django which allows writing REST APIs.
If like me you develop DRF APIs and you like pydantic , drf-pydantic
is for you 😍.
pip install drf-pydantic
Use drf_pydantic.BaseModel
instead of pydantic.BaseModel
when creating your
models:
from drf_pydantic import BaseModel
class MyModel(BaseModel):
name: str
addresses: list[str]
Whenever you need a DRF serializer you can get it from the model like this:
MyModel.drf_serializer
ℹ️ INFO
Models created usingdrf_pydantic
are fully identical to those created bypydantic
. The only change is the addition of thedrf_serializer
attribute during class creation (not instance).
If you have an existing code base, and you would like to use the drf_serializer
attribute to only specific models, then great news 🥳 - you can easily extend
your existing pydantic
models by adding drf_pydantic.BaseModel
to the list
of parent classes.
Your existing pydantic models:
from pydantic import BaseModel
class Pet(BaseModel):
name: str
class Dog(Pet):
breed: str
Update your Dog
model and get serializer via the drf_serializer
:
from drf_pydantic import BaseModel as DRFBaseModel
from pydantic import BaseModel
class Pet(BaseModel):
name: str
class Dog(DRFBaseModel, Pet):
breed: str
Dog.drf_serializer
⚠️ ATTENTION
Inheritance order is important:drf_pydantic.BaseModel
must always go before thepydantic.BaseModel
class.
If you have nested models and you want to generate serializer only from one of them,
you don't have to update all models - only update the model you need, drf_pydantic
will generate serializers for all normal nested pydantic
models for free 🐱👤.
from drf_pydantic import BaseModel as DRFBaseModel
from pydantic import BaseModel
class Apartment(BaseModel):
floor: int
tenant: str
class Building(BaseModel):
address: str
aparments: list[Apartment]
class Block(DRFBaseModel):
buildings: list[Buildind]
Block.drf_serializer
- Add option to create custom serializer for complex models
- Add support for constraints (max, min, regex, etc.)