【Python百日进阶-Web开发-Peewee】Day288 - Peewee 的扩展(七)shortcuts / 信号支持

文章目录

    • 13.13 快捷模式 Shortcuts
        • model_to_dict
        • dict_to_model
        • update_model_from_dict
        • resolve_multimodel_query
        • class ThreadSafeDatabaseMetadata
    • 13.14 信号支持 Signal support
      • 13.14.1 连接处理程序 Connecting handlers
      • 13.14.2 信号 API
        • class Signal

13.13 快捷模式 Shortcuts

该模块包含帮助函数,用于表达使用 peewee 的 API 会有些冗长或繁琐的事物。还有用于将模型序列化为字典的助手,反之亦然。

model_to_dict
model_to_dict(model[, recurse=True[, backrefs=False[, only=None[, exclude=None[, extra_attrs=None[, fields_from_query=None[, max_depth=None[, manytomany=False]]]]]]]])

参数:

  • recurse ( bool ) – 是否应该递归外键。
  • backrefs ( bool ) – 是否应该递归相关对象的列表。
  • only – 应包含在结果字典中的字段实例列表(或集合)。
  • exclude – 应从结果字典中排除的字段实例列表(或集合)。
  • extra_attrs – 实例上应包含在字典中的属性或方法名称列表。
  • fields_from_query ( Select ) –SelectQuery创建此模型实例的。只有查询明确选择的字段和值才会被序列化。
  • max_depth ( int ) – 递归时的最大深度。
  • manytomany ( bool ) – 处理多对多字段。
    将模型实例(以及可选的任何相关实例)转换为字典。

例子:

>>> user = User.create(username='charlie')
>>> model_to_dict(user)
{'id': 1, 'username': 'charlie'}>>> model_to_dict(user, backrefs=True)
{'id': 1, 'tweets': [], 'username': 'charlie'}>>> t1 = Tweet.create(user=user, message='tweet-1')
>>> t2 = Tweet.create(user=user, message='tweet-2')
>>> model_to_dict(user, backrefs=True)
{'id': 1,'tweets': [{'id': 1, 'message': 'tweet-1'},{'id': 2, 'message': 'tweet-2'},],'username': 'charlie'
}>>> model_to_dict(t1)
{'id': 1,'message': 'tweet-1','user': {'id': 1,'username': 'charlie'}
}>>> model_to_dict(t2, recurse=False)
{'id': 1, 'message': 'tweet-2', 'user': 1}

model_to_dict的实现相当复杂,因为它试图支持各种用途。如果您有特殊用途,我强烈建议您不要尝试将一些疯狂的参数组合硬塞到此函数中。只需编写一个简单的函数来完成您正在尝试做的事情。

dict_to_model
dict_to_model(model_class, data[, ignore_unknown=False])

参数:

  • model_class ( Model ) – 要构造的模型类。
  • data ( dict ) – 数据字典。外键可以作为嵌套字典包含,反向引用可以作为字典列表。
  • ignore_unknown ( bool ) – 是否允许无法识别的(非字段)属性。
    将数据字典转换为模型实例,在适当的地方创建相关实例。

例子:

>>> user_data = {'id': 1, 'username': 'charlie'}
>>> user = dict_to_model(User, user_data)
>>> user
<__main__.User at 0x7fea8fa4d490>>>> user.username
'charlie'>>> note_data = {'id': 2, 'text': 'note text', 'user': user_data}
>>> note = dict_to_model(Note, note_data)
>>> note.text
'note text'
>>> note.user.username
'charlie'>>> user_with_notes = {
...     'id': 1,
...     'username': 'charlie',
...     'notes': [{'id': 1, 'text': 'note-1'}, {'id': 2, 'text': 'note-2'}]}
>>> user = dict_to_model(User, user_with_notes)
>>> user.notes[0].text
'note-1'
>>> user.notes[0].user.username
'charlie'
update_model_from_dict
update_model_from_dict(instance, data[, ignore_unknown=False])

参数:

  • instance ( Model ) – 要更新的模型实例。
  • data ( dict ) – 数据字典。外键可以作为嵌套字典包含,反向引用可以作为字典列表。
  • ignore_unknown ( bool ) – 是否允许无法识别的(非字段)属性。
    使用给定的数据字典更新模型实例。
resolve_multimodel_query
resolve_multimodel_query(query[, key='_model_identifier'])

参数:

  • query- 复合选择查询。
  • key ( str ) – 用于存储模型标识符的键
    返回:
    一个可迭代游标,它为复合选择查询中选择的每一行生成正确的模型实例。

用于将复合选择查询中返回的行解析为正确模型实例类型的帮助程序。例如,如果您有两个不同表的并集,则此帮助程序将在迭代查询结果时将每一行解析为正确的模型。

class ThreadSafeDatabaseMetadata
class ThreadSafeDatabaseMetadata

Metadata提供对属性的线程安全访问的模型实现database,允许应用程序在运行时在多线程应用程序中安全地交换数据库。

用法:

from playhouse.shortcuts import ThreadSafeDatabaseMetadata# Our multi-threaded application will sometimes swap out the primary
# for the read-replica at run-time.
primary = PostgresqlDatabase(...)
read_replica = PostgresqlDatabase(...)class BaseModel(Model):class Meta:database = primarymodel_metadata_class = ThreadSafeDatabaseMetadata

13.14 信号支持 Signal support

带有信号钩子的模型(a-la django)在 playhouse.signals. 要使用信号,您需要项目的所有模型都是 的子类playhouse.signals.Model,它会覆盖必要的方法来为各种信号提供支持。

from playhouse.signals import Model, post_saveclass MyModel(Model):data = IntegerField()@post_save(sender=MyModel)
def on_save_handler(model_class, instance, created):put_data_in_cache(instance.data)

警告
Model.insert()由于我希望是显而易见的原因,当您使用、Model.update()或 Model.delete()方法时,Peewee 信号不起作用。这些方法会生成超出 ORM 范围执行的查询,并且 ORM 不知道在查询执行时哪些模型实例可能会或可能不会受到影响。
信号通过挂钩到更高级别的 peewee API 来工作,例如 Model.save()and Model.delete_instance(),其中受影响的模型实例是提前知道的。

提供以下信号:

  • pre_save:在将对象保存到数据库之前立即调用。提供一个额外的关键字参数created,指示模型是第一次保存还是更新。
  • post_save:在将对象保存到数据库后立即调用。提供一个额外的关键字参数created,指示模型是第一次保存还是更新。
  • pre_delete:在使用时从数据库中删除对象之前立即调用Model.delete_instance() 。
  • post_delete:在使用时从数据库中删除对象后立即调用Model.delete_instance() 。
  • pre_init:第一次实例化模型类时调用

13.14.1 连接处理程序 Connecting handlers

每当发送信号时,它都会调用任何已注册的处理程序。这允许完全独立的代码来响应模型保存和删除等事件。

该类Signal提供了一个connect()方法,该方法接受一个回调函数和“sender”和“name”的两个可选参数。如果指定,“sender”参数应该是单个模型类,并允许您的回调仅接收来自该模型类的信号。如果您希望取消注册信号处理程序,“name”参数用作方便的别名。

示例用法:

from playhouse.signals import *def post_save_handler(sender, instance, created):print('%s was just saved' % instance)# our handler will only be called when we save instances of SomeModel
post_save.connect(post_save_handler, sender=SomeModel)

所有信号处理程序都接受它们的前两个参数sender和 instance,其中sender是模型类,并且instance是被操作的实际模型。

如果您愿意,还可以使用装饰器连接信号处理程序。这在功能上等同于上面的示例:

@post_save(sender=SomeModel)
def post_save_handler(sender, instance, created):print('%s was just saved' % instance)

13.14.2 信号 API

class Signal
class Signal

存储接收者(回调)列表,并在调用“发送”方法时调用它们。

connect(receiver[, sender=None[, name=None]])

参数:

  • receiver ( callable ) – 一个至少需要两个参数的 callable,一个“sender”,它是触发信号的 Model 子类,一个“instance”,它是实际的模型实例。
  • sender ( Model ) – 如果指定,只有这个模型类的实例会触发接收者回调。
  • name ( string ) – 一个简短的别名
    将接收者添加到接收者的内部列表中,每当发送信号时都会调用该列表。
from playhouse.signals import post_save
from project.handlers import cache_busterpost_save.connect(cache_buster, name='project.cache_buster')

disconnect([receiver=None[, name=None]])

参数:

  • receiver ( callable ) – 断开连接的回调
  • name ( string ) – 一个简短的别名
    断开给定的接收器(或具有给定名称别名的接收器),使其不再被调用。必须提供收件人或姓名。
post_save.disconnect(name='project.cache_buster')

send(instance, *args, **kwargs)

参数: 实例– 模型实例
遍历接收器并按照它们连接的顺序调用它们。如果接收者指定了发送者,那么只有当实例是发送者的实例时才会调用它。

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

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

相关文章

Python7:接口自动化学习1 RPC

API&#xff08;Application Programmming Interface&#xff09; 应用编程接口&#xff0c;简称“接口” 接口&#xff1a;程序之间约定的通信方法 特点&#xff1a;约定了调用方法&#xff0c;以及预期的行为&#xff0c;但是不透露具体细节 意义&#xff1a;程序能解耦&…

【No.20】蓝桥杯简单数论下|寻找整数|素数的判断|笨小猴|最大最小公倍数|素数筛|埃氏筛|欧氏线性筛|质数|分解质因子(C++)

寻找整数 【题目描述】 有一个不超过 1 0 1 7 10^17 1017的正整数n&#xff0c;知道这个数除以2至49后的余数如下表所示&#xff0c;求这个正整数最小是多少 解法一&#xff1a;模拟 暴力法&#xff1a;一个个检验 1 … 1 0 17 1\dots 10^{17} 1…1017的每个数 由于这个数n…

【pytest、playwright】构建POM项目,以及解决登录问题,allure环境问题

目录 前言 1、文件目录 2、安装依赖 3、POM项目实战-案例&#xff1a;打开指定页面 目录结构&#xff1a; pages中的代码&#xff1a; cases中的代码&#xff1a; 4、解决登录问题 问题&#xff1a; 解决方案&#xff1a; 获取登录的用户信息&#xff08;cookie&a…

DasViewer电脑客户端打开文件夹时,一直显示崩溃,该怎么解决?

问题如图 如若用的是DasViewer V3.2.4Beta版本&#xff0c;可以换回3.2.1版本进行尝试。 DasViewer是由大势智慧自主研发的免费的实景三维模型浏览器,采用多细节层次模型逐步自适应加载技术,让用户在极低的电脑配置下,也能流畅的加载较大规模实景三维模型,提供方便快捷的数据浏…

发送请求- header配置

请求头里是客户端的要求&#xff0c;把你的诉求告诉服务端&#xff0c;服务端按照你的要求返回数据 &#xff0c; 请求header需要严格全配置&#xff0c;把请求header全部传入&#xff0c;不能频繁访问&#xff0c;让后端知道它是正常请求 一般只配置User-Agent和Content Typ…

vue如何将对象中不为空的键值对拼接到地址栏后面

在我们日常开发中&#xff0c;在调get接口时&#xff0c;需要按照https://mp.fbwz.net/mp_blog/creaton/editor?not_checkout1&not_checkon2&#xff0c;这种类型进行调接口&#xff0c;那么我们需要把对象中那些不为空的参数拼接成此类型&#xff0c;可以使用以下方法&am…

云原生靶场kebernetesGoat、Metarget

靶场 文章目录 靶场kebernetesGoat靶场安装Docker in DockerSSRF漏洞容器逃逸到主系统Docker CIS 基线分析Kubernetes CIS 安全基线分析分析被部署挖矿软件的容器镜像获取环境信息Hidden in layersRBAC最低权限配置错误使用 Sysdig Falco 进行运行时安全监控和检测 Metarget ke…

flutter 保存一堆多语言翻译词条,由key和value组成

原理&#xff1a; 1.从String列表里面获取某个value&#xff1a; List<String> jsonStrings [{"name": "John", "age": 30},{"name": "Jane", "age": 25},{"name": "Bob", "age…

iOS App 上架指南及关键

引言 上架App Store是将iOS应用提交申请并上线的过程&#xff0c;旨在让应用在App Store上展示&#xff0c;吸引用户并获取流量。本文将介绍iOS上架的整体流程&#xff0c;并提供一些建议和注意事项。 一、iOS上架的整体流程 1. 申请开发者账号 首先&#xff0c;需要申请苹…

网络入门基础:从零开始了解互联网世界

随着互联网技术的飞速发展&#xff0c;网络已经成为我们生活中不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;网络都扮演着重要的角色。然而&#xff0c;对于初学者来说&#xff0c;网络世界可能显得复杂而陌生。本文旨在为大家提供一个网络入门基础的指南&#xff0…

Ubuntu安装nginx-http-flv,并获取统计信息

1、依赖安装 sudo apt-get install build-essential sudo apt-get install libpcre3 libpcre3-dev sudo apt-get install libssl-dev sudo apt-get install zlib1g sudo apt-get install zlib1g-dev 2、源码下载 NGINX 的版本应该大于或者等于 1.2.6&#xff0c;与其他版本的…

实战LangChain(三):深化交互——利用Neo4j提升聊天机器人的对话能力

实战LangChain(三):深化交互——利用Neo4j提升聊天机器人的对话能力 实战LangChain(一):构建您的第一个聊天机器人_langchai 机器人 实战LangChain(二):探索RAG——为聊天机器人注入知识-CSDN博客 实战LangChain(三):深化交互——利用Neo4j提升聊天机器人的对话…

2024年150道高频Java面试题(三)

5. String str“i” 与 String strnew String(“i”) 一样吗&#xff1f; String str "i" 和 String str new String("i") 在Java中并不完全相同&#xff0c;尽管它们都用于创建包含单个字符 ‘i’ 的字符串对象。 首先&#xff0c;String str "…

第三十三章 配置服务器访问 - SSL TLS 参数

文章目录 第三十三章 配置服务器访问 - SSL TLS 参数SSL TLS 参数可选参数错误页面复制服务器配置禁用对已配置服务器的访问删除服务器配置 第三十三章 配置服务器访问 - SSL TLS 参数 SSL TLS 参数 以下参数仅与使用 SSL/TLS 来保护 Web Gateway 和IRIS 之间的连接的安装相关…

DevSecOps平台架构系列-亚马逊云AWS DevSecOps平台架构

目录 一、概述 二、AWS DevSecOps实施原则 2.1 尽早采用安全测试&#xff0c;加速问题反馈 2.2 优先考虑预防性安全控制 2.3 部署检测性安全控制时&#xff0c;确保有与之互补的响应性安全控制 2.4 安全自动化 2.5 总结 三、AWS DevSecOps关键组件 3.1 关键组件 3.2 关…

新能源汽车充电桩主板各模块成本占比解析

汽车充电桩主板是汽车充电桩的重要组件&#xff0c;主要由微处理器模块、通信模块、控制模块、安全保护模块、传感器模块等多个模块构成。深入探究各模块在总成本中的比重&#xff0c;我们可以更好地优化成本结构、提高生产效率&#xff0c;并为未来的技术创新和市场需求变化做…

TypeScript【入门】

TypeSript ts是js的一个超集&#xff0c;解决js类型支持 js: 动态类型 ts:静态类型 代码执行的顺序是先编译在执行 发现错误更早 为什么要添加类型支持&#xff1f; 优势有什么&#xff1f; 全局安装 npm i -g typescript tsc -v 简化运行ts的步骤 typescript常用类型 类型…

音频干扰检测(频域方法)

测试音响系统的通路上是否有外部干扰时&#xff0c;可以通过播放1000赫兹的正弦波信号&#xff0c;在输出端采集数字信号&#xff08;I2S&#xff0c;TDD&#xff0c;A2B&#xff09;并保存为.wav文件。 然后通过以下Python代码检测。 import numpy as np import librosa im…

C++类和对象、面向对象编程 (OOP)

文章目录 一、封装1.抽象、封装2.类和对象(0)学习视频(1)类的构成(2)三种访问权限(3)struct和class的区别(4)私有的成员变量、共有的成员函数(5)类内可以直接访问私有成员&#xff0c;不需要经过对象 二、继承三、多态1.概念2.多态的满足条件3.多态的使用条件4.多态原理剖析5.纯…

MySQL详细教程

文章目录 前言一、数据库管理1.查看已有的数据库2.创建数据库3.删除数据库4.进入数据库 二、 数据表管理1.查看当前数据库下的所有数据表2.创建数据表3.删除表4.查看表结构 三、常用数据类型1.整型tinyintintbigint 2.浮点型floatdoubledecimal 3.字符型char(m)varchar(m)textm…