DRF Pydantic Integration

2.9.1 · active · verified Fri Apr 17

drf-pydantic is a Python library that enables seamless integration of Pydantic models with the Django REST Framework (DRF). It allows developers to use Pydantic for data validation and serialization within DRF serializers, leveraging Pydantic's robust schema definition and validation capabilities. The current version is 2.9.1, and it typically follows a release cadence tied to Django, DRF, or Pydantic updates, with minor releases for features and bug fixes.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart demonstrates how to define a Pydantic model, create a `PydanticSerializer` for it, and then use it within a DRF `APIView` for both validating incoming data (POST) and serializing outgoing data (GET). The validated data from the serializer is a Pydantic model instance.

from pydantic import BaseModel, Field
from typing import Optional
from drf_pydantic.serializers import PydanticSerializer
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

# 1. Define your Pydantic model
class ItemCreate(BaseModel):
    name: str = Field(..., max_length=100)
    description: Optional[str] = None
    price: float = Field(..., gt=0)

# 2. Create a PydanticSerializer
class ItemCreateSerializer(PydanticSerializer):
    class Meta:
        model = ItemCreate

# 3. Use the serializer in a DRF View
class ItemAPIView(APIView):
    def post(self, request):
        serializer = ItemCreateSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        # Access validated data as a Pydantic model instance
        item_instance: ItemCreate = serializer.validated_data
        # In a real application, you would save `item_instance` to a database
        # or perform other business logic here.
        print(f"Received item: {item_instance.dict()}")
        return Response(item_instance.dict(), status=status.HTTP_201_CREATED)

    def get(self, request):
        # Example of serializing a Pydantic instance for output
        example_item = ItemCreate(name="Sample Widget", price=29.99)
        serializer = ItemCreateSerializer(instance=example_item)
        return Response(serializer.data)

view raw JSON →