Django(七、模型层)
文章目录
- 模型层
- 模型层前期准备
- 使用django ORM要注意
- 代码演示:
- 切换MySQL数据库
- 如何查看django ORM 底层原理?
- 单表操作
- 模型层之ORM常见关键字
- 基础的增删改查
- 常用的关键字
- 常见的十几种查询
- 基于双下滑线的查询
模型层
模型层前期准备
使用django ORM要注意
1.django自带的sqlite3数据可对时间字段不敏感,有时候会展示错乱,所以我们习惯切换成常见的数据库比如MySQL。
2.django ORM并不会自动帮我们创建数据库,所以我们需要提前准备好‘db001’库
3.id字段是自动添加的,如果想自定义主键,只需要在其中一个字段中店家primary_key=True,如果django发现你已经明确的设置了Field.primary_key,它将不会自动添加ID列
4.django支持mysql5.5及更高版本。
默认不允许单独测试某个py文件,如果想要测试某个py文件,一般是测试models.py文件
测试环境1:pycharm提供的python console(临时保存,不推荐使用)
测试环境2:自己搭建(自带的test或者自己创建的py文件)
1.拷贝manage.py前四行代码
2.自己再添加两行import djangodjango.setup()
代码演示:
tests.py
# manage.py中拷贝前四行代码
import os
import sys
if __name__=='__main__': # 需要在__name__下运行os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoProject6.settings')# 1.引入django配置文件# 手写两行import djangodjango.setup() # 2.启动django# 导入app01文件夹内models文件并 测试models文件内User运行from app01 import modelsmodels.User.objects.all()
models.py
class Userinfo(models.Model):username = models.CharField(max_length=32)password = models.CharField(max_length=64)age = models.IntegerField(null=True)register_time = models.DateTimeField(verbose_name='注册事件', auto_now_add=True)"""DateField : 年月日DateTimeField : 年月日 时分秒两个重要参数auto_now : 每次操作数据的时候 该字段会自动将当前时间更新 auto_now_add : 在创建数据的时候会自动将当前创建时间记录下来 之后只要不人为的修改 那么就一直不变"""def __str__(self):return self.username

切换MySQL数据库
1.提前终端创建好库db001
2.将DATABASES的配置更改DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'db001','USER':'root','PASSWORD':'123123','HOST':'127.0.0.1','PORT':3306,'CHARSET':'utf8'}
}
3.连接MySQL库,数据迁移
4.makemigrations
5.migrate
如何查看django ORM 底层原理?
django ORM本质还是SQL语句。
1.如果有QuerySet对象,那么可以直接点query查看SQL语句
res2 = models.Userinfo.objects.values_list('id', 'username')
print(res.query)
SELECT `app01_userinfo`.`id`, `app01_userinfo`.`username` FROM `app01_userinfo`
结论:有些不是QuerySet对象,就不能通过点query的形式点出来,就只能使用通过的方法
2.如果想查看所有ORM底层的SQL语句,也可以直接在配置文件添加日志记录
res1 = models.User.objects.create(name='kimi',age=16)
print(res.query) # 会报错settings最后>>>拷贝代码放在settingsLOGGING = {'version': 1,'disable_existing_loggers': False,'handlers': {'console':{'level':'DEBUG','class':'logging.StreamHandler',},},'loggers': {'django.db.backends': {'handlers': ['console'],'propagate': True,'level':'DEBUG',},}
}
单表操作
模型层之ORM常见关键字
基础的增删改查
| 方法 | 返回值 |
|---|---|
| create(字段名=数据) | 刚创建的数据记录对象 |
| filter(筛选条件) | QuerySet列表对象 |
| filter().update(修改内容) | 受影响的行数 |
| filter().delete() | 受影响的行数即各表受影响的行数 |
常用的关键字
| create | 描述 |
|---|---|
| filter | 创建数据并直接获取当前创建的数据对象 |
| first/last | 根据条件筛选数据 结果是QuerySet [数据对象1,数据对象2] |
| update | 拿queryset里面第一个元素/拿queryset里面最后一个元素 |
| delete | 删除数据(批量删除) |
| all | 查询所有数据 结果是QuerySet [数据对象1,数据对象2] |
| values | 根据指定字段获取数据 结果是QuerySet [{}},{},{},{}] |
| values_list | 根据指定字段获取数据 结果是QuerySet [(),(),(),()] |
| distinct | 去重 数据一定要一模一样才可以 如果有主键肯定不行 |
| order_by | 根据指定条件排序 默认是升序 字段前面加负号就是降序 |
| get | 根据条件筛选数据并直接获取到数据对象 一旦条件不存在会直接报错 不建议使用 |
| exclude | 取反操作 |
| reverse | 颠倒顺序(被操作的对象必须是已经排过序的才可以) |
| count | 统计结果集中数据的个数 |
| exists | 判断结果集中是否含有数据 如果有则返回True 没有则返回False |
常见的十几种查询
if __name__=='__main__':os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day06_1.settings') # 1.引入django配置文件import djangodjango.setup() # 2.启动djangofrom app01 import modelsres = models.Userinfo.objects.filter(pk=1).first() # 查询id为1的数据print(res)# 查询所有数据,但是只要id和username字段res1 = models.Userinfo.objects.values('id', 'username')for i in res1:print(i['id'],i['username'])res2 = models.Userinfo.objects.values_list('id', 'username') # 取出来的对象是列表套元组,可以通过索引取值print(res2) # <QuerySet [(1, 'jack'), (2, 'jerry'), (3, 'tank')]>print(res2[0][1]) # jackprint(res2.query) # SELECT `app01_userinfo`.`id`, `app01_userinfo`.`username` FROM `app01_userinfo`查看底层的SQL语句res3 = models.Userinfo.objects.all().values('password').distinct() # distinct 去重print(res3) # <QuerySet [{'password': '123'}, {'password': '222'}]>res4 = models.Userinfo.objects.all().order_by('id') # order_by 默认按照升序排序,在需要查找的值中加一个-号就是降序,可以添加多个字段排序print(res4)res5 = models.Userinfo.objects.all().order_by('-id').reverse() # reverse 反转排序,前提是已经排过序了print(res5)res6 = models.Userinfo.objects.filter(password=123).count() # count 统计当前数据的个数print(res6)res7 = models.Userinfo.objects.exclude(pk=1) # exclude 查询除了id=1的所有数据print(res7)res8 = models.Userinfo.objects.filter(pk=4).exists() # exists 查询当前数据是否存在print(res8)res9 = models.Userinfo.objects.create(username='sb',password=123) # 添加数据print(res9)
基于双下滑线的查询
1 年龄大于35岁的数据res = models.User.objects.filter(age__gt=35)print(res)2 年龄小于35岁的数据res = models.User.objects.filter(age__lt=35)print(res)大于等于 小于等于res = models.User.objects.filter(age__gte=32)print(res)res = models.User.objects.filter(age__lte=32)print(res)年龄是18 或者 32 或者40res = models.User.objects.filter(age__in=[18,32,40])print(res)年龄在18到40岁之间的 首尾都要res = models.User.objects.filter(age__range=[18,40])print(res)查询出名字里面含有s的数据 模糊查询res = models.User.objects.filter(name__contains='s')print(res)是否区分大小写 查询出名字里面含有p的数据 区分大小写res = models.User.objects.filter(name__contains='p')print(res)忽略大小写res = models.User.objects.filter(name__icontains='p')print(res)res = models.User.objects.filter(name__startswith='j')res1 = models.User.objects.filter(name__endswith='j')print(res,res1)查询出注册时间是 2020 1月res = models.User.objects.filter(register_time__month='1')res = models.User.objects.filter(register_time__year='2020')
相关文章:
Django(七、模型层)
文章目录 模型层模型层前期准备使用django ORM要注意 代码演示:切换MySQL数据库如何查看django ORM 底层原理? 单表操作模型层之ORM常见关键字基础的增删改查常用的关键字 常见的十几种查询基于双下滑线的查询 模型层 模型层前期准备 使用django ORM要…...
LeetCode105. Construct Binary Tree from Preorder and Inorder Traversal
文章目录 一、题目二、题解 一、题目 Given two integer arrays preorder and inorder where preorder is the preorder traversal of a binary tree and inorder is the inorder traversal of the same tree, construct and return the binary tree. Example 1: Input: pre…...
python链表_递归求和_递归求最大小值
创建一个单链表: class LinkNode: #设置属性def __init__(self,data None):self.data dataself.next None class LinkList: #设置头结点def __init__(self):self.head LinkNode()self.head.next Nonedef CreateListR(self,a): …...
Java中生成指定字体的印章
文章目录 1.引入字体2.Windows环境下3. Linux环境下 生成印章测试类绘制方章测试类 1.引入字体 2.Windows环境下 如果在Windows上安装JAVA环境时,没有安装单独的jre1.8.0_141的话。那么字体就只放到\jdk1.8.0_141\jre\lib\fonts目前下。 3. Linux环境下 cat /etc…...
Winodws核心编程 多线程
目录 一、基本概念 二、线程创建函数 三、Windows内核对象与句柄 四、简单的多线程案例 五、线程同步 - 互斥对象 六、多线程实现群聊的服务端和客户端 七、线程同步 - 事件对象 八、事件对象 与 互斥对象区别 九、线程同步 - 信号量 十、线程同步 - 关键代码段 十一…...
旺店通·企业版对接打通金蝶云星空查询调拨单接口与分布式调入单新增接口
旺店通企业版对接打通金蝶云星空查询调拨单接口与分布式调入单新增接口 源系统:旺店通企业版 旺店通是北京掌上先机网络科技有限公司旗下品牌,国内的零售云服务提供商,基于云计算SaaS服务模式,以体系化解决方案,助力零售企业数字化…...
关于对Java中volatile关键字的理解与简述
【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/134430096 出自【进步*于辰的博客】 启发之作:Java volatile关键字最全总结…...
37 _ 贪心算法:如何用贪心算法实现Huffman压缩编码?
基础的数据结构和算法我们基本上学完了,接下来几节,我会讲几种更加基本的算法。它们分别是贪心算法、分治算法、回溯算法、动态规划。更加确切地说,它们应该是算法思想,并不是具体的算法,常用来指导我们设计具体的算法和编码等。 贪心、分治、回溯、动态规划这4个算法思想…...
Unity中Shader矩阵的逆矩阵
文章目录 前言一、逆矩阵的表示二、逆矩阵的作用四、逆矩阵的计算五、顺序的重要性六、矩阵的逆总结1、求矩阵的逆前,这个矩阵必须得是个方阵2、只有 A x A ^-1^ A^-1^ x A 1时,A的逆才是A^-1^3、求2x2矩阵的逆:交换 a 和 b 的位置…...
我给网站做公安备案年度安全评估
我是卢松松,点点上面的头像,欢迎关注我哦! 差不多从2020年开始,我们的网站每年11月左右就要去公安备案做一次年度的安全评估,而现在又新增了APP和小程序备案。如下图所示: 评估的内容也很简单,…...
iceoryx(冰羚)-通信中间件解析
iceoryx(冰羚)-简介 iceoryx(冰羚)-Architecture iceoryx(冰羚)-Service Discovery iceoryx(冰羚)-examples-callbacks iceoryx(冰羚)-Listener设计 [iceoryx(冰羚)-ipc消息通信] [iceoryx(冰羚)-共享内存实现]...
Windows系统CMake+VS编译protobuf
目录 一些名词CMake构建VS工程下载protobuf源码下载CMake编译QT中使用 方案二失败:CMakeQT自带的Mingw编译参考链接 一些名词 lib dll lib库实际上分为两种,一种是静态链接lib库或者叫做静态lib库,另一种叫做动态链接库dll库的lib导入库或称…...
HarmonyOS开发(三):ArkTS基础
1、ArkTS演进 Mozilla创建了JS ---> Microsoft创建了TS ----> Huawei进一步推出ArkTS 从最初的基础逻辑交互(JS),到具备类型系统的高效工程开发(TS),再到融合声明式UI、多维状态管理等丰富的应用开发能力&…...
Java排序算法之堆排序
图解 堆排序是一种常见的排序算法,它借助了堆这种数据结构。堆是一种完全二叉树,它可以分为两种类型:最大堆和最小堆。在最大堆中,每个结点的值都大于等于它的子结点的值,而在最小堆中,每个结点的值都小于等…...
『GitHub项目圈选02』一款可实现视频自动翻译配音为其他语言的开源项目
🔥🔥🔥本周GitHub项目圈选****: 主要包含视频翻译、正则填字游戏、敏感词检测、聊天机器人框架、AI 换脸、分布式数据集成平台等热点项目。 1、pyvideotrans pyvideotrans 是一个视频翻译工具,可将一种语言的视频翻译为另一种语…...
Unity - Cinemachine
动态获取Cinemachine的内部组件 vCam.GetCinemachineComponent<T>() 动态修改Cinemachine的Transposer属性 var vCamComp transfrom.GetComponent<CinemachineVirtualCamera>(); var transposerComp vCamComp.GetCinemachineComponent<CinemachineTransposer&…...
准备搞OpenStack了,先装一台最新的Ubuntu 23.10
正文共:1113 字 25 图,预估阅读时间:2 分钟 依稀记得前面发了一篇Ubuntu的安装文档(66%的经验丰富开发者和69%的学生更喜欢的Ubuntu的安装初体验),当时安装的是20.04.3的版本,现在看来已经是非常…...
Android 12 客制化修改初探-Launcher/Settings/Bootanimation
Android 12 使用 Material You 打造的全新系统界面,富有表现力、活力和个性。使用重新设计的微件、AppSearch、游戏模式和新的编解码器扩展您的应用。支持隐私信息中心和大致位置等新的保护功能。使用富媒体内容插入功能、更简便的模糊处理功能、经过改进的原生调试…...
【JavaEE初阶】 HTML基础详解
文章目录 🎋什么是HTML?🍀HTML 结构🚩认识标签🚩HTML 文件基本结构🚩快速生成代码框架 🎄HTML 常见标签🚩注释标签🚩标题标签: h1-h6🚩段落标签: pǶ…...
C# Socket通信从入门到精通(10)——如何检测两台电脑之间的网络是否通畅
前言: 我们在完成了socket通信程序开发以后,并且IP地址也设置好以后,可以先通过一些手段来测试两台电脑之间的网络是否通畅,如果确认了网络通畅以后,我们再测试我们编写的Socket程序。 1、同时按下键盘的windows键+"R"键,如下图: 下面两张图是两种键盘的情…...
Kerberos身份认证原理与实战排错指南
1. 为什么今天还要花时间搞懂 Kerberos?——一个被低估的“老协议”正在悄悄支撑着你的日常你每天登录公司内网查邮件、访问财务系统提交报销、用 Jenkins 构建代码、甚至在 Windows 域环境中打开一台同事的共享文件夹……这些看似顺滑的操作背后,大概率…...
硬件答辩问题总结
一、电源纹波是什么,为什么LDO的小,DCDC的大1.电源纹波电源纹波 是指直流电源输出电压上叠加的 交流波动成分,表现为电压在理想直流值附近上下波动。2.LDO 纹波小原理LDO 内部是一个 调整管(可变电阻) 串联在输入和输出…...
iPaaS 应用场景深度解析:从系统孤岛到数据自由流动的六大实战路径
写在前面 一个企业的数字化程度越高,系统就越多。系统越多,集成问题就越严重。 这不是假设,而是我们在服务客户过程中反复验证的结论——企业数字化转型的瓶颈,往往不在于"造新系统",而在于"连老系统&q…...
SAP-ABAP:变量、常量、结构与内表声明(10篇博客合集) 第五篇:声明时的键值设计技巧:结构与内表的主键、非主键配置指南
变量、常量、结构与内表声明(10篇博客合集) 第五篇:声明时的键值设计技巧:结构与内表的主键、非主键配置指南如果把内表比作一张内存中的“数据库表”,那么键就是这张表的索引甚至主键。键的设计直接决定了数据的唯一性…...
【MySQL数据库 | 第一篇】 概述
数据库相关概念: 数据库(Database):数据库是指一组有组织的数据的集合,通过计算机程序进行管理和访问。数据库管理系统:操纵和管理数据库的大型软件SQL:操作关系型数据库的编程语言,定义了一套操作关系型数…...
电子商务设计师软考备战:特别篇 - 综合模拟与备考策略
1. 考试形式与内容结构1.1 考试基本信息考试科目与时间基础知识考试:上午9:00-11:30(150分钟)应用技术考试:下午2:00-4:30(150分钟)题型与分值分布上午考试(基础知识): -…...
告别数据饥荒:用PyTorch手把手实现原型网络(Prototypical Networks)做电影评论情感分类
告别数据饥荒:用PyTorch手把手实现原型网络做电影评论情感分类 在自然语言处理领域,情感分析一直是热门研究方向,但现实中的开发者常面临一个尴尬困境:标注数据太少。传统深度学习方法动辄需要成千上万的标注样本,而实…...
从“DOC/PDF”到“WPS”:细看GJB438C-2021文档格式要求背后的国产化信号与落地指南
从“DOC/PDF”到“WPS”:GJB438C-2021文档格式变革的深度解读与实施策略 当一份国家军用标准在文档格式描述中刻意删除"DOC/PDF"字样,转而明确标注"(WPS)文档处理器"时,这绝非简单的技术参数调整。…...
Keil µVision链接器错误204解决方案
1. 问题现象与背景解析最近在使用Keil Vision进行嵌入式开发时,不少工程师遇到了一个令人头疼的链接器错误。具体表现为编译时出现"FATAL ERROR 204: INVALID KEYWORD"的致命错误,错误位置指向链接器控制文件中的特定行。这个问题在C166和C51两…...
RevSSH反向SSH隧道:无公网IP设备的安全远程运维方案
1. 这不是又一个SSH封装工具——RevSSH解决的是“根本性连接悖论”你有没有遇到过这样的场景:一台部署在客户内网的嵌入式设备,没有公网IP,NAT穿透失败,防火墙策略死死锁住所有入向端口,连ICMP都被禁了;或者…...
