Django json字段由pydantic赋能
项目描述
Django Structured JSON Field

这是一个Django字段,允许您声明JSON字段的架构并进行验证。
安装
pip install django-structured-field
用法
from django.db import models
from structured.fields import StructuredJSONField
from structured.pydantic.models import BaseModel
# Define this schema as you would do with a Pydantic model
class MySchema(BaseModel):
name: str
age: int = None
def init_data():
return MySchema(name='')
# Create a model with a StructuredJSONField with the schema you defined
class MyModel(models.Model):
structured_data = StructuredJSONField(schema=MySchema, default=init_data)
关系
此字段支持模型之间的关系,您可以在您的架构中定义它们,它们将被视为正常的Django关系。它还支持递归架构。
递归
您可以通过将属性类型声明为字符串来定义递归架构
from typing import Optional, List
class MySchema(BaseModel):
name: str
age: int = None
parent: Optional['MySchema'] = None
relateds: List['MySchema'] = []
外键
您还可以在架构中定义模型关系
from structured.pydantic.fields import ForeignKey
class MySchema(BaseModel):
name: str
age: int = None
fk_field: ForeignKey['MyModel'] = None
这将把父字段视为一个普通的Django ForeignKey。
技巧
您可以省略ForeignKey
字段,直接使用模型类作为类型注解
class MySchema(BaseModel):
name: str
age: int = None
fk_field: MyModel = None
如果类型注解是 django models.Model
的子类,该字段仍然会被视为 ForeignKey。
多对多关系
如果您需要一个多对多关系,可以使用 QuerySet
字段。
from structured.pydantic.fields import QuerySet
class MySchema(BaseModel):
name: str
age: int = None
parents: QuerySet['MyModel']
QuerySet
字段将生成一个 django 对象管理器,允许您像使用正常的 django QuerySet
一样查询相关对象。
instance = MySchema(name='test', age=10, parents=MyModel.objects.all())
# You can filter the queryset
instance.parents.filter(name='test')
# You can count the queryset
instance.parents.count()
# You can get the first element of the queryset, etc...
instance.parents.first()
缓存
为了避免字段进行多次相同的查询,使用缓存技术。缓存仍在开发中,如果您发现任何问题,请提交一个 issue。实际上,缓存涵盖了 StructuredJSONField 内部的所有关系,优化了序列化过程中的查询。
缓存引擎进度
- 在
ForeignKey
字段和QuerySet
字段之间共享缓存 - 通过嵌套模式共享缓存
- 通过嵌套的 schemas 列表共享缓存
- 在同一个实例中所有
StructuredJSONFields
之间共享缓存 - 在多个同一模型的实例之间共享缓存
- 缓存失效机制
设置
您可以通过修改 settings.py
文件中的 STRUCTURED_FIELD
设置来管理结构化字段的特性。以下为可用的设置及其默认值列表
STRUCTURED_FIELD = {
'CACHE':{
'ENABLED': True,
'SHARED': False # ⚠️ EXPERIMENTAL: this enables a thread-shared cache, it's not recommended to use it in production.
},
}
贡献
该项目接受贡献,只需打开一个 issue 或 PR 即可。
运行测试
pip install -r requirements-dev.txt
make test
运行测试应用
pip install -r requirements-dev.txt
python manage.py migrate
python manage.py runserver
许可协议
本项目采用 MIT 许可协议 - 有关详细信息,请参阅 LICENSE 文件。
项目详情
关闭
哈希值 for django_structured_json_field-0.1.0-py2.py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8a30716a67e5f3a5d7fa355ab6955385517b3abf03e5899efeeb0c784f13a40c |
|
MD5 | 07e0b2b581b6072b881a8a3faf7d213c |
|
BLAKE2b-256 | 20b4bf67233e92e32b7fb3378bc33e4f544d5dabff54490227b51b266ed940fc |