Pydantic模型支持Django ORM
项目描述
Djantic
文档: 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": ""
}
模型架构定义是可组合的,并且支持根据自动生成的字段和任何附加注解来自定义输出。
包含和排除字段
在模型实例中暴露的字段可以通过两种选项进行配置: include
和 exclude
。这些表示应包含字段名称字符串列表的可迭代对象。一次只能设置这些选项之一,如果没有设置,则默认行为是包含 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 查看哈希值)
关闭
djantic-0.7.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1b074b595879145582a726d9e6491b9c72e53e98efdfd445420c6b12ddfe5a85 |
|
MD5 | c71977673e295da9e40affd1ab1f399f |
|
BLAKE2b-256 | c9814578201857a070dba7adbd7a306784a58562220e86e3ba220d5bd77307ac |
关闭
djantic-0.7.0-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1ea0e6560d41e2d2350d8bb6a173ed8b1bcdd86fa8af5d0b7748e3609a8d5924 |
|
MD5 | 52399d33a7f3d4c8218aea651126b76d |
|
BLAKE2b-256 | 513cd261d929fab71ffc95cd874934e26053d0ecddcca325f3cb7fddfc4e27de |