跳转到主要内容

Pydantic模型支持Django ORM

项目描述

Djantic

Pydantic模型支持 Django

GitHub Workflow Status (Test) PyPi package Supported Python versions Supported Django versions


文档: https://jordaneremieff.github.io/djantic/


Djantic是一个库,提供了一个可配置的实用类,用于为任何Django模型类自动创建Pydantic模型实例。它旨在支持所有底层Pydantic模型功能,如JSON模式生成,并为导出Django模型实例数据引入了自定义行为。

快速入门

使用pip安装

pip install djantic

创建模型模式

from users.models import User

from djantic import ModelSchema

class UserSchema(ModelSchema):
    class Config:
        model = User

print(UserSchema.schema())

输出

{
        "title": "UserSchema",
        "description": "A user of the application.",
        "type": "object",
        "properties": {
            "profile": {"title": "Profile", "description": "None", "type": "integer"},
            "id": {"title": "Id", "description": "id", "type": "integer"},
            "first_name": {
                "title": "First Name",
                "description": "first_name",
                "maxLength": 50,
                "type": "string",
            },
            "last_name": {
                "title": "Last Name",
                "description": "last_name",
                "maxLength": 50,
                "type": "string",
            },
            "email": {
                "title": "Email",
                "description": "email",
                "maxLength": 254,
                "type": "string",
            },
            "created_at": {
                "title": "Created At",
                "description": "created_at",
                "type": "string",
                "format": "date-time",
            },
            "updated_at": {
                "title": "Updated At",
                "description": "updated_at",
                "type": "string",
                "format": "date-time",
            },
        },
        "required": ["first_name", "email", "created_at", "updated_at"],
    }

更多信息请见https://docs.pydantic.org.cn/usage/models/

加载和导出模型实例

使用模型模式的from_orm方法加载Django模型实例以进行导出

user = User.objects.create(
    first_name="Jordan", 
    last_name="Eremieff", 
    email="jordan@eremieff.com"
)

user_schema = UserSchema.from_orm(user)
print(user_schema.json(indent=2))

输出

{
    "profile": null,
    "id": 1,
    "first_name": "Jordan",
    "last_name": "Eremieff",
    "email": "jordan@eremieff.com",
    "created_at": "2020-08-15T16:50:30.606345+00:00",
    "updated_at": "2020-08-15T16:50:30.606452+00:00"
}

使用多级关系

Djantic支持多级关系。这包括外键、多对多和一对一关系。

考虑以下Django模型和Djantic模型模式定义的示例Django模型

# models.py
from django.db import models

class OrderUser(models.Model):
    email = models.EmailField(unique=True)


class OrderUserProfile(models.Model):
    address = models.CharField(max_length=255)
    user = models.OneToOneField(OrderUser, on_delete=models.CASCADE, related_name='profile')


class Order(models.Model):
    total_price = models.DecimalField(max_digits=8, decimal_places=5, default=0)
    user = models.ForeignKey(
        OrderUser, on_delete=models.CASCADE, related_name="orders"
    )


class OrderItem(models.Model):
    price = models.DecimalField(max_digits=8, decimal_places=5, default=0)
    quantity = models.IntegerField(default=0)
    order = models.ForeignKey(
        Order, on_delete=models.CASCADE, related_name="items"
    )


class OrderItemDetail(models.Model):
    name = models.CharField(max_length=30)
    order_item = models.ForeignKey(
        OrderItem, on_delete=models.CASCADE, related_name="details"
    )
# schemas.py
from djantic import ModelSchema

from orders.models import OrderItemDetail, OrderItem, Order, OrderUserProfile


class OrderItemDetailSchema(ModelSchema):
    class Config:
        model = OrderItemDetail

class OrderItemSchema(ModelSchema):
    details: List[OrderItemDetailSchema]

    class Config:
        model = OrderItem

class OrderSchema(ModelSchema):
    items: List[OrderItemSchema]

    class Config:
        model = Order

class OrderUserProfileSchema(ModelSchema):
    class Config:
        model = OrderUserProfile

class OrderUserSchema(ModelSchema):
    orders: List[OrderSchema]
    profile: OrderUserProfileSchema

现在假设您想将特定用户的订单和配置文件信息导出为包含所有相关项目对象详细信息的JSON格式

user = OrderUser.objects.first()
print(OrderUserSchema.from_orm(user).json(ident=4))

输出

{
    "profile": {
        "id": 1,
        "address": "",
        "user": 1
    },
    "orders": [
        {
            "items": [
                {
                    "details": [
                        {
                            "id": 1,
                            "name": "",
                            "order_item": 1
                        }
                    ],
                    "id": 1,
                    "price": 0.0,
                    "quantity": 0,
                    "order": 1
                }
            ],
            "id": 1,
            "total_price": 0.0,
            "user": 1
        }
    ],
    "id": 1,
    "email": ""
}

模型架构定义是可组合的,并且支持根据自动生成的字段和任何附加注解来自定义输出。

包含和排除字段

在模型实例中暴露的字段可以通过两种选项进行配置: includeexclude。这些表示应包含字段名称字符串列表的可迭代对象。一次只能设置这些选项之一,如果没有设置,则默认行为是包含 Django 模型中的所有字段。

例如,要包含用户模型中的所有字段,除了名为 email_address 的字段,您将使用 exclude 选项。

class UserSchema(ModelSchema):
    class Config:
        exclude = ["email_address"]

此外,您还可以将字段限制为仅包含模型架构类的注解,通过将 include 选项设置为特殊字符串值: "__annotations__"

class ProfileSchema(ModelSchema):
        website: str

        class Config:
            model = Profile
            include = "__annotations__"

    assert ProfileSchema.schema() == {
        "title": "ProfileSchema",
        "description": "A user's profile.",
        "type": "object",
        "properties": {
            "website": {
                "title": "Website",
                "type": "string"
            }
        },
        "required": [
            "website"
        ]
    }

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分发

djantic-0.7.0.tar.gz (25.1 kB 查看哈希值)

上传时间

构建分发

djantic-0.7.0-py3-none-any.whl (28.8 kB 查看哈希值)

上传时间 Python 3

由以下机构支持

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误记录StatusPageStatusPage状态页面