jsonmodels.model.base

news2024/11/24 15:31:19

欢迎来到猫子酱的学习之旅

  • jsonmodels.model
    • 创建模型
    • 用法
      • 验证 validate()
      • 验证器 Validators
      • 自定义验证器(**)
      • 默认值
      • 转换为Python结构(和JSON)
      • 为您的模型创建JSON模式(***) (结合Draft7Validator)
      • 结构和对象中的不同名称

在这里插入图片描述

jsonmodels.model

创建模型

import jsonmodels # 导入

class Cat(models.Base):

    name = fields.StringField(required=True)
    breed = fields.StringField()


class Dog(models.Base):

    name = fields.StringField(required=True)
    age = fields.IntField()


class Car(models.Base):

    registration_number = fields.StringField(required=True)
    engine_capacity = fields.FloatField()
    color = fields.StringField()


class Person(models.Base):

    name = fields.StringField(required=True)
    surname = fields.StringField(required=True)
    car = fields.EmbeddedField(Car)
    pets = fields.ListField([Cat, Dog])

用法

可以将其看作普通对象

person = Person(name='Chuck')
person.name # 'Chuck'

person.surname # None

person.populate(surname='Norris')

person.surname # 'Norris'

person.name # 'Chuck'

验证 validate()

您可以指定哪些字段是必需的,使用 .validate() 进行一个校验,校验失败会出现ValidationError

bugs = Person(name='Bugs', surname='Bunny')
bugs.validate()

dafty = Person()
dafty.validate() # ValidationError: Field is required!
注意: 如果在初始化期间没有分配任何值,则必需字段不会引发错误,但首次尝试访问会引发错误。
dafty = Person()
dafty.name # ValidationError: Field is required!

每次分配新值时都会进行验证,因此尝试将int分配给StringField也会引发错误:(可以用作自定义校验,感觉有点类似与DRF中的序列化器了)

dafty.name = 3 # ValidationError: ('Value is wrong, expected type "basestring"', 3)
在将模型转换为JSON或JSONSchema期间,始终调用显式验证。(这句话不是很懂,好像就是一个抛出错误的方式吧)

验证器 Validators

验证器可以通过验证器关键字、作为单个验证器或验证器列表传递(因此,您不能传递扩展List的对象)。您可以尝试使用此库附带的验证器(jsonmodels.validators)。已发送的验证器会影响生成的模式 开箱即用,使用JSON模式给你的全部潜力。

自定义验证器(**)

可以与Draft7Validator结合使用。
您始终可以指定自己的验证器。自定义验证器可以是具有验证方法(优先)或函数(或可调用对象)的对象。每个验证器都必须引发异常以指示验证未通过。返回False等值不会产生任何影响。

class RangeValidator(object):

  def __init__(self, min, max):
   # Some logic here.

  def validate(self, value):
    # Some logic here.

def some_validator(value):
  # Some logic here.

class Person(models.Base):

  name = fields.StringField(required=True, validators=some_validator)
  surname = fields.StringField(required=True)
  age = fields.IntField(
    Car, validators=[some_validator, RangeValidator(0, 100)])

如果您的验证器有方法modify_schema您可以使用它以任何方式影响生成的模式。给定参数是单个字段的模式。例如

class Length(object):

def validate(self, value):
    # Some logic here.

def modify_schema(self, field_schema):
    if self.minimum_value:
        field_schema['minLength'] = self.minimum_value

    if self.maximum_value:
        field_schema['maxLength'] = self.maximum_value

默认值

您可以为每个字段指定默认值(此默认值将显示在生成的架构中)。目前只接受标量并为EmbeddedField的实例建模,如下例所示:

class Pet(models.Base):
    kind = fields.StringField(default="Dog")

class Person(models.Base):
    name = fields.StringField(default="John Doe")
    age = fields.IntField(default=18)
    pet = fields.EmbeddedField(Pet, default=Pet(kind="Cat"))
    profession = fields.StringField(default=None)

使用此模式生成如下所示:

{
    "type": "object",
    "additionalProperties": false,
    "properties": {
        "age": {
            "type": "number",
            "default": 18
        },
    "name": {
            "type": "string",
            "default": "John Doe"
        },
        "pet": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "kind": {
                    "type": "string",
                    "default": "Dog"
                }
            },
            "default": {
                "kind": "Cat"
            }
        },
        "profession": {
            "type": "string",
            "default": null
        }
    }
}

转换为Python结构(和JSON)

模型实例可以很容易地转换为Python结构(jsonmodels.models.PreBase.to_struct()):

cat = Cat(name='Garfield')
dog = Dog(name='Dogmeat', age=9)
car = Car(registration_number='ASDF 777', color='red')
person = Person(name='Johny', surname='Bravo', pets=[cat, dog])
person.car = car
person.to_struct() # (...)

Python --> JSON:

import json
person_json = json.dumps(person.to_struct())

为您的模型创建JSON模式(***) (结合Draft7Validator)

JSON模式,jsonmodel,您可以只对模型进行操作。

person = Person()
schema = person.to_json_schema()

您可以通过您的API提供此模式或使用它来验证传入数据。

结构和对象中的不同名称

如果您想(或必须)在生成/使用的数据及其模式中使用不同的名称,您可以对字段使用name=参数:

class Human(models.Base):

    name = fields.StringField()
    surname = fields.StringField(name='second-name')

name值将在您使用对象的所有地方用作别名,并且在所有结构中都将被视为第二个名称-因此在ute表示和jsonSchema中也是如此。

>>> john = Human(name='John', surname='Doe')
>>> john.surname
'Doe'
>>> john.to_struct()
{'name': 'John', 'second-name': 'Doe'}
注意,您的模型不得具有无法通过模型解析的冲突名称。不过,您可以使用交叉引用,如下所示:
**结构名称具有优先级,因此使用上面的Foo模型,您可能会遇到错误的假设:**
class Foo(models.Base):

    one = fields.IntField(name='two')
    two = fields.IntField(name='one')
   
>>> foo = Foo(one=1, two=2)
>>> foo.one
2  # Not 1, like expected
>>> foo.two
1  # Not 2, like expected

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/552822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯单片机串口通信学习提升笔记

今日得以继续蓝桥杯国赛备赛之旅: 有道是 “不知何事萦怀抱,醒也无聊,醉也无聊,梦也何曾到谢桥。” 那我们该如何 让这位诗人纳兰 “再听乐府曲 ,畅解相思苦”呢? 那就建立起串口通信吧! 我…

论文阅读_音频表示_W2V-BERT

信息 number headings: auto, first-level 2, max 4, _.1.1 name_en: w2v-BERT: Combining Contrastive Learning and Masked Language Modeling for Self-Supervised Speech Pre-Training name_ch: W2V-BERT:结合对比学习和Mask语言建模进行自监督语音预训练 pape…

Redis实现全局唯一Id

Redis实现全局唯一Id 全局唯一Id简介二、Redis实现全局唯一Id实践2.1添加RedisIdWorker配置类2.2测试类 全局唯一Id简介 系统当中有些场景如果使用数据库自增ID就存在一些问题: id的规律性太明显受单表数据量的限制 场景分析:如果我们的id具有太明显的…

基于UDP和TCP套接字实现简单的回显客户端服务器程序

目录 1. 套接字 2. 基于UDP 套接字实现的简单客户端 服务器程序 3. 基于TCP套接字实现的简单客户端 服务器程序 1. 套接字 之前我们有分享到协议分层这个概念,其中就讲到上层协议调用下层协议,下层协议给上层协议提供支持,这里支持指的是就是socket套接字,它是操作系统给应用…

宁波市天一杯 --- Crypto wp

文章目录 secretrsa secret 题目: p134261118796789547851478407090640074022214132682000430136383795981942884853000826171189906102866323044078348933419038543719361923320694974970600426450755845839235949167391987970330836004768360774676424958554946…

坦克大战进阶--发射子弹

坦克大战进阶–发射子弹 1. 坦克大战0.3 1.1 分析 利用线程基础的知识,把坦克大战再次进阶一下:当我们按下J键,坦克就能够发射一颗子弹。 1.2 思路 当发射一颗子弹后,就相当于启动一个线程Mytank 有子弹的对象,当…

MSP432笔记5——外部中断

所用单片机型号:MSP432P401r 今日继续我的MSP432电赛速通之路。 外部中断是个很有用的配置 STM32几乎每个I/O口都能配置复用为外部中断 但MSP432并不是这样。 我经过查阅数据手册发现支持中断的引脚为: P1^0~ P1^7 P3^0~ P3^7 P5^0~ P5^…

Gateway服务网关入门

Gateway服务网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。…

【网络字节序】

网络字节序 我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分。网络数据流同样有大端小端之分,那么如何定义网络数据流的地址呢?发送主机通常将发送…

【C++】21年精通C++之泛型编程和模板初阶知识

❤️前言 大家好!今天和大家一起学习关于C泛型编程和模板初阶的相关知识。 正文 我们之前已经学习了C中非常重要的一个特性——函数重载,函数重载很好地提高了我们代码的可读性。但是对于适配多种参数的某种函数来说,我们如果使用函数重载就…

感知程序从ros切换到cyber_rt框架下,pcl相关问题

1.在ubuntu20.04下,原感知程序需要的是pcl1.8.1,车上其他程序使用的是pcl.1.10.0或者pcl1.10.0,在编译pcl1.10.0时会编译通不过,而pcl1.10.1可以顺利编译通过,安装pcl1.8.1时遇到的问题可能如下,及对应的修…

CTF必看~ PHP反序列化漏洞6:绝妙_wakeup绕过技巧

作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络攻防。我的…

iptables防火墙2

iptables防火墙 一:SNAT原理与应用 SNAT 应用环境:局域网主机共享单个公网IP地址接入Internet(私有不能早Internet中正常路由)SNAT原理:修改数据包的源地址。 SNAT转换前提条件: 1.局域网各主机已正确设…

新星计划 Electron+vue2 桌面应用 2 搭建及运行

基础内容:新星计划 Electronvue2 桌面应用 1 基础_lsswear的博客-CSDN博客 根据使用过的经验和官网的描述,大概可以有四种方式: 自己创建项目(仅使用npm)用Electron脚手架HBuilder编译为web,再用Electron…

MSP432笔记4:时钟与滴答计时器

所用单片机型号:MSP432P401r 今日继续更新我的MSP432电赛速通笔记: 提示: 本节内容相当于讲述delay_ms() 和delay_us() 俩延时函数的由来, 所以不需要花费过多时间斟酌 MSP432单…

论文阅读_音频表示_wav2vec_2.0

论文信息 name_en: wav2vec 2.0: A Framework for Self-Supervised Learning of Speech Representations name_ch: wav2vec 2.0:语音表示自监督学习框架 paper_addr: http://arxiv.org/abs/2006.11477 date_read: 2023-04-27 date_publish: 2020-10-22 tags: [‘深…

C++深度解析:虚函数的使用与避免

C深度解析:虚函数的使用与避免 1. 虚函数的基本概念与原理 (Basic Concepts and Principles of Virtual Functions)1.1 虚函数的定义与作用 (Definition and Role of Virtual Functions)1.2 虚函数的底层实现 (Underlying Implementation of Virtual Functions)1.3 …

【CANN训练营0基础赢满分秘籍】进阶班 Atlas 200I DK 智能小车

1 智能小车三维结构设计 1.1 基本模块 坚固酷炫结构模块运动控制模块超声波传感器模块摄像头视觉模块其他传感器模块 1.2 结构设计基本原则 从零开始设计并搭建智能小车,在满足外观要求的基础上,要满足小车运转过程中的运动干涉率为O,并且…

【CANN训练营0基础赢满分秘籍】进阶班 应用开发深入讲解

1 AIPP AIPP (Artificial Intelligence Pre-Processing)人工智能预处理,在AI Corfe上完成数据预处理。 1.1 静态AIPP 构造AIPP配置文件*.cfg使能静态AIPP,将其配置参数保存在模型文件中。 atc --framework3--soc_versionS[soc_version) --model SHOM…

基于51单片机的电子琴Protues仿真设计

一、设计背景 基于51单片机的电子琴是一款由51单片机控制器、音频模块和硬件阵列组成的数字化乐器。它可以模拟各种乐器的音效,同时也具有许多常规电子琴所没有的高级功能。 首先,这种电子琴是以数字信号处理技术为基础的。通过软件编程,将…