Skip to main content

A lightweight utility that converts Django models into fully-typed Pydantic models.

Project description

django-pydantic-models

A lightweight utility that converts Django models into fully-typed Pydantic models, supporting automatic field mapping, validation constraints, and nested model generation for related fields (ForeignKey, OneToOneField, ManyToManyField).

PyPI version License


✨ Features

  • 🔁 Automatic mapping from Django fields to Pydantic types
  • 🧠 Smart support for Django field constraints:
    • max_length, choices, default, help_text, verbose_name
  • 📦 Supports nested models for ForeignKey, OneToOneField, ManyToManyField
  • ⚙️ Extensible with Pydantic validators and configuration
  • 🛠️ Add or exclude fields selectively using __fields__ or __exclude__
  • 🚀 Ideal for FastAPI, data validation, or serialization needs

[!NOTE] This is not a competitor to djantic but an optimiser for working around with FastAPI and Django while keeping the traditions - use of decorator - alive.


📦 Installation

pip install django-pydantic-models

🛠 Usage

from django.db import models
from django_pydantic_models import django_model_to_pydantic


class Author(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()


class Book(models.Model):
    title = models.CharField(max_length=200, help_text="Title of the book")
    published = models.BooleanField(default=False)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    tags = models.ManyToManyField("Tag")


class Tag(models.Model):
    name = models.CharField(max_length=50)


@django_model_to_pydantic(Book)
class BookOut:
    __fields__ = "__all__"  # or list specific fields like ('title', 'author')

    class Config:
        config = {"populate_by_name": True}

    __validators__ = {
        "title": lambda v: v.title()  # Example Pydantic validator
    }

🧩 Field Mapping

Django fields are automatically mapped to their closest Pydantic equivalents. Examples:

Django Field Pydantic Type
CharField str
EmailField EmailStr
URLField HttpUrl
IntegerField int
DateTimeField datetime
ForeignKey nested Pydantic model
ManyToManyField List[nested model]
choices= Literal[...]

🔍 Customization

Selecting fields

class BookOut:
    __fields__ = ('title', 'author')  # Include only
    # or use __exclude__ = ('published',)

Validators

class BookOut:
    __validators__ = {
        "title": lambda v: v.strip().title()
    }

Pydantic Config

class BookOut:
    class Config:
        config = {
            "populate_by_name": True,
            "extra": "forbid"
        }

🧪 Initialization

Models can be initialized from a Django instance:

book = Book.objects.select_related("author").prefetch_related("tags").first()
pydantic_book = BookOut(book)
print(pydantic_book.model_dump())

Or with kwargs:

pydantic_book = BookOut(title="New Book", author=AuthorOut(...))

📄 License

This project is licensed under the MIT License. See the LICENSE file for details.


🤝 Contributing

Pull requests, issues, and feature suggestions are welcome! Please open an issue or PR.


📌 Why This Exists

Django models are great for ORM use but don't offer native support for fully typed external interfaces (e.g., APIs). django-pydantic-models bridges this gap, letting you use Django models for database interactions and automatically generate Pydantic models for typed validation and data exchange.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_pydantic_models-0.0.2.tar.gz (6.8 kB view details)

Uploaded Source

File details

Details for the file django_pydantic_models-0.0.2.tar.gz.

File metadata

  • Download URL: django_pydantic_models-0.0.2.tar.gz
  • Upload date:
  • Size: 6.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.0

File hashes

Hashes for django_pydantic_models-0.0.2.tar.gz
Algorithm Hash digest
SHA256 8b67e52740f7b484421ee7b642444bfeac3d5aff417c6b294c02f2087fa154a5
MD5 ddfe1e914b021ad2ed9b79962bceef4e
BLAKE2b-256 b0b5ac5867dafc0b89385c1c45946107d7bc9f7e63e2b995c17b903d567d64b2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page