跳转到主要内容

Django json字段由pydantic赋能

项目描述

Django Structured JSON Field PyPI Codecov GitHub Workflow Status GitHub

这是一个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 文件。

项目详情


下载文件

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

源分发

django_structured_json_field-0.1.0.tar.gz (1.7 MB 查看哈希值)

上传时间

构建分发

django_structured_json_field-0.1.0-py2.py3-none-any.whl (1.7 MB 查看哈希值)

上传时间 Python 2 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面