ORM中常用的字段和参数,正反向概念

django表查询测试环境搭建

  首先,在此之前我们先来回顾一下之前学习的orm内容

1. django自带一个小型的sqlite3的小型数据库

  但是这个数据库的功能非常有限,并且针对日期类型的数据兼容性很差

2. 切换数据库数据(MySQL)

  2.1 在django1.x版本中你需要在__init__.py文件中写入这样的配置

  import pymysql

  pymysql.install_as_MySQLdb()

  2.2 在django2.x,3.x,4.x版本中只需要下载插件即可

  pip install mysqlclient

3. 定义模型类(在pycharm中创建表)

  class 表名(models.Model):

    字段名 = models.字段类型

  总结一下一些orm中的字段类型:

ORM含义

 MySQL

AutoField

int自增列,里面的参数要加上primary_Key=True字键

如果没有,就会自动创建一个名为id的主键

auto_increment

primary key

IntegerField整数类型int()
CharField

字符串类型

需要提供max=length长度参数

char()  varchar()
DateField

日期类型

YYY-MM-DD

datetime.date()
DateTimeField

日期类型

YYY-MM-DD hh:mm:ss

datetime.datetime()

日期字段很重要(牢记)

  auto_now: 每次操作数据并保存都会自动更新当前时间

  auto_now_add:只在创建数据的那一刻自动获取当前时间,之后如果不人为更改就不变

4. 执行数据库迁移命令(模型类>>>表)

  就是将我们创建的类表变成mysql表的形式

  python38 manage.py makemigrations

  python38 manage.py migrate

  执行Tools中的Run manage.py Taks后还可以简写为

  makemigrations

  migrite

5. 模型层测试环境准备

  方式1:

import osdef main():os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day59.settings')import django   # 这个导入模块不能写到外面去django.setup()from app01 import modelsprint(models.User.objects.filter())if __name__ == '__main__':main()

  方式2:

    pycharm提供测试环境  :python console命令行测试环境

ORM常见查询关键字

前题

1. 当需要查询数据主键字段值的时候 可以使用pk忽略掉数据字段真正的名字

2. 在模型类中可以定义一个__str__方法 便于后续数据对象被打印展示的是查看方便

3. Queryset中如果是列表套对象那么直接for循环和索引取值但是索引不支持负数

4. 虽然queryset支持索引但是当queryset没有数据的时候索引会报错 推荐使用first()

十三种必会ORM查询关键字

  models.类名.objects.方法()

1. filter()

  筛选数据 返回值是一个QuerySet(可以看成是列表套数据对象)

  1.括号内不写查询条件 默认就是查询所有

  2.括号内可以填写条件 并且支持多个 逗号隔开 默认是and关系

2. all()

  查询所有数据 返回值是一个QuerySet(可以看成是列表套数据对象)

3. first()

  获取Queryset中第一个数据对象 如果为空则返回None

4. last()

  获取Queryset中最后一个数据对象 如果为空则返回None

5. get()

  直接根据条件查询具体的数据对象 但是条件不存在直接报错 不推荐使用

6. values()

  指定查询字段 结果是Queryset(可以看成是列表套字典数据)

7. values_list()

  指定查询字段 结果是Queryset(可以看成是列表套元组数据)

8. order_by()

  指定字段排序 默认是升序 在字段前加负号则为降序 并且支持多个字段排序

9. count()

  统计orm查询之后结果集中的数据格式

10. distinct()

  针对重复的数据集进行去重 一定要注意数据对象中的主键

11. exclude()

  针对括号内的条件取反进行数据查询 QuerySet(可以看成是列表套数据对象)

12. reverse()

  针对已经排了序的结果集做颠倒

13. exists()

  判断查询结果集是否有数据 返回布尔值 但是几乎不用因为所有数据自带布尔值

额外补充:

  raw()

    用pycharm在raw()中写sql语句

  还可以借助模块写sql语句

from django.db import connection  cursor = connection.cursor()  cursor.execute("insert into hello_author(name) VALUES ('郭敬明')") cursor.execute("update hello_author set name='韩寒' WHERE name='郭敬明'")  cursor.execute("delete from hello_author where name='韩寒'")  cursor.execute("select * from hello_author")  cursor.fetchone()  cursor.fetchall()

回顾双下str(__str__)方法

1. 双下str方法是类中的魔法方法之一  

  __str__

      return '对象:%s'%self.name

     1. 对象被执行打印操作的时候会自动触发(print和页面展示都是打印)

     2. 该方法必须返回一个字符串

               3. 返回什么字符串打印对象之后就展示什么字符串

2. 其他类中的魔法方法还有 

__init__实例化对象的时候自动触发
__str__对象被执行打印操作的时候会自动触发
__getattr__当对象获取一个不存在的属性名 自动触发
__setattr__对象操作属性值的时候自动触发
__del__对象在被删除(主动 被动)的时候自动触发
__getattribute__对象获取属性的时候自动触发 无论这个属性存不存在
当类中既有__getattr__又有__getattribute__的时候 只会走后者
__enter__对象被with语法执行的时候自动触发 该方法返回什么 as关键字后面的变量名就能得到什么
__exit__对象被with语法执行并运行完with子代码之后 自动触发

补充

1. 创建表

 create() 创建数据 返回值就是当前创建的数据对象

 save()       

  user_obj = models.User(name='oscar', age=24)
   user_obj.save()

2. 更新数据

  .update()

3. 删除数据

  .delete()

 

神奇的双下划线的查询

1. 比较运算符

字段__gt大于
字段__lt小于
字段__gte大于等于
字段__lte小于等于

2. 成员运算符

  字段__in

3. 范围查询(数字)

  字段__range

4. 模糊查询

  字段__contains   不忽略大小写

  字段__icontains     忽略大小写

5. 日期处理

  字段__year

  字段__month

  字段__day

查看ORM底层的SQL语句

1. 方式1:

  如果是Queryset对象 那么可以直接用Queryset对象.query,然后右键运行程序查看SQL语句

但是有些语句没有Queryset对象,那么就要用到下面的方法

2. 方式2:

  配置文件配置 打印所有的ORM操作对应的SQL语句 直接拷贝使用即可

  之后直接运行程序就能看到SQL语句了

LOGGING = {'version': 1,'disable_existing_loggers': False,'handlers': {'console':{'level':'DEBUG','class':'logging.StreamHandler',},},'loggers': {'django.db.backends': {'handlers': ['console'],'propagate': True,'level':'DEBUG',},}}

ORM外键字段创建

一对多

  ORM中外键字段建在多的一方 models.ForeignKey()

  会自动添加_id后缀

多对多

  ORM中有三种创建多对多字段的方式     models.ManyToManyField()

    方式1:直接在查询频率较高的表中填写字段即可 自动创建第三张关系表

    方式2:自己创建第三张关系表

    方式3:自己创建第三张关系表 但是还是要orm多对多字段做关联

一对一

  ORM中外键字段建在查询频率较高的表中    models.OneToOneField()

  会自动添加_id后缀

ps:

  django1.X 针对 models.ForeignKey() models.OneToOneField()不需要on_delete
  django2.X 3.X 则需要添加on_delete参数


外键字段数据操作

一对多:

  models.ForeignKey(to='Publish', on_delete=models.CASCADE)

  方式1       直接给实际字段添加关联数据值     publish_id = 1

  方式2  间接使用外键虚拟字段添加数据对象 publish=publish_obj

多对多:

  models.OneToOneField(to='AuthorDetail', on_delete=models.CASCADE)

  方式1  直接给实际字段添加关联数据值     author_detail_id = 1

  方式2  间接使用外键虚拟字段添加数据对象

一对一:

  author_detail=authorDetail_obj

  models.ManyToManyField(to='Author')

add()

  添加数据  括号内即可以填写数字值也可以填写数据对象 支持多个

remove()

  删除数据  括号内即可以填写数字值也可以填写数据对象 支持多个

set()

  修改数据  括号内必须是可迭代对象 

clear()

  清空指定数据  括号内不需要任何参数


正反向概念

核心:

   看看外键在哪个类中创建的

正向查询

  外键在A中,通过A查询B的操作就叫做正向查询

反向查询

  外键在A中,通过B查询A的操作就叫做反向查询

ORM跨表查询口诀:

  正向查询按外键字段,

  反向查询按表名小写. 


基于对象的跨表查询(子查询)

步骤:

  1. 先根据条件查询数据对象

  2. 以对象为基准,思考正反向概念

# 1.查询主键为1的书籍对应的出版社(书>>>出版社)
# 1.1.先根据条件查询数据对象(先查书籍对象)
book_obj = models.Book.objects.filter(pk=1).first()
# 1.2.以对象为基准 思考正反向概念(书查出版社 外键字段在书表中 所以是正向查询)
print(book_obj.publish)# 2.查询主键为3的书籍对应的作者(书>>>作者)
# 2.1.先根据条件查询数据对象(先查书籍对象)
book_obj = models.Book.objects.filter(pk=3).first()
# 2.2.以对象为基准 思考正反向概念(书查作者 外键字段在书表中 所以是正向查询)
print(book_obj.authors)  # app01.Author.None
print(book_obj.authors.all())# 3.查询jason的作者详情
# 3.1.先根据条件查询数据对象
author_obj = models.Author.objects.filter(name='jason').first()
# 3.2.以对象为基准 思考正反向概念
print(author_obj.author_detail)
'''基于对象的反向跨表查询'''
# 4.查询南方出版社出版的书籍
# 4.1.先拿出版社对象
publish_obj = models.Publish.objects.filter(name='南方出版社').first()
# 4.2.思考正反向
# print(publish_obj.book)
# print(publish_obj.book_set)  # app01.Book.None
print(publish_obj.book_set.all())# 5.查询jason写过的书
# 5.1.先拿作者对象
author_obj = models.Author.objects.filter(name='jason').first()
# 5.2.思考正反向
# print(author_obj.book)
# print(author_obj.book_set)  # app01.Book.None
print(author_obj.book_set.all())# 6.查询电话是110的作者
# 6.1.先拿作者详情对象
author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
# 6.2.思考正反向
print(author_detail_obj.author)

基于双下划线的跨表查询(连表操作)

'''基于双下划线的正向跨表查询'''
# 1.查询主键为1的书籍对应的出版社名称及书名
res = models.Book.objects.filter(pk=1).values('publish__name','title')
print(res)
# 2.查询主键为3的书籍对应的作者姓名及书名
res = models.Book.objects.filter(pk=3).values('authors__name', 'title')
print(res)
# 3.查询jason的作者的电话号码和地址
res = models.Author.objects.filter(name='jason').values('author_detail__phone','author_detail__addr')
print(res)
'''基于双下划线的反向跨表查询'''
# 4.查询南方出版社出版的书籍名称和价格
res = models.Publish.objects.filter(name='南方出版社').values('book__title','book__price')
# print(res)# 5.查询jason写过的书的名称和日期
res = models.Author.objects.filter(name='jason').values('book__title','book__publish_time')
# print(res)# 6.查询电话是110的作者姓名和年龄
res = models.AuthorDetail.objects.filter(phone=110).values('author__name','author__age')
print(res)"""
研究ORM跨表本质
# 7.查询主键为1的书籍对应的作者电话号码
res = models.Book.objects.filter(pk=1).values('authors__author_detail__phone')print(res)
"""

 

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

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

相关文章

Android TextView.setText() 引发的卡顿问题

在 Android 开发中,TextView 是一个非常基础和常用的用户界面组件,用于在屏幕上显示文本内容。TextView 继承自 View 类,并提供了展示文本以及相关样式处理的功能。 TextView 允许开发者在应用程序的用户界面中显示格式化的文本内容。它支持…

PotPlayer+Alist挂载并播放网盘视频

文章目录 说明技术WebDAVPotPlayer 操作步骤一:Alist开启WebDAV代理二:PotPlayer连接Alist 说明 Alist网页端播放视频受限,主要是文件大于20MB,由于官方限制,无法播放需要使用user-agent修改插件,设置百度…

html中如何给input输入框这个一个默认值

在HTML中&#xff0c;要给<input>输入框设置一个默认值&#xff0c;你可以使用value属性。下面是一个简单的例子&#xff0c;展示了如何为一个文本输入框设置一个默认值&#xff1a; <input type"text" value"这是默认值">在这个例子中&#…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-24-处理单选和多选按钮-上篇

1.简介 在工作和生活中&#xff0c;经常会遇到我们需要进行选择的情况&#xff0c;比如勾选我们选择性别&#xff0c;男女两个性别总是不能同时选中的&#xff0c;再比如我们在选择兴趣爱好时&#xff0c;我们可以选择多个自己感兴趣的话题&#xff0c;比如&#xff1a;篮球、…

sqllabs第46关 order by 注入

简介&#xff1a;&#xff08;order by注入-错误回显-POST注入&#xff09; 请求方法&#xff1a;POST 方法&#xff1a;order by注入错误回显数字型注入 先了解下 order by参数注入&#xff1a; order by 注入是指其后面的参数是可控的&#xff0c; order by 不同于我们在 whe…

gem5学习(23):经典缓存——Classic Caches

目录 一、Interconnects 1、Crossbars 二、Debugging 官网教程&#xff1a;gem5: Classic caches 默认缓存是一个带有MSHR&#xff08;未命中状态保持寄存器&#xff09;和WB&#xff08;写缓冲区&#xff09;的非阻塞缓存&#xff0c;用于读取和写入未命中。缓存还可以启用…

6.3 存储卡

本节介绍Android的文件存储方式--在存储卡上读写文件&#xff0c;包括&#xff1a;公有存储空间与私有存储空间有什么区别&#xff0c;如何利用存储卡读写文本文件&#xff0c;如何利用存储卡读写图片文件&#xff0c;如何在App运行的时候动态申请权限等。 6.3.1 私有存储空间…

Android应用图标防止被系统缩放问题

问题 Launcher显示应用的图标时可能有一定程度的缩放和剪裁后剧中&#xff0c;可能导致我们应用的图标看起来过小。 解决方法 在icon资源中用xml去放置资源ic_launcher.xml&#xff0c;不要直接使用png&#xff0c;然后把自己的资源放在xml中的foreground 标签中。 <appli…

关于Linux搭建DedeCMS说明

使用环境 1. Ubuntu 22.042. PhP 4.0 3. nginx4. MySQL 5.7软件安装 安装nginx #1. 更新系统 sudo apt update && sudo apt upgrade -y#2. 安装nginx sudo apt install nginx -y安装MySQL apt list -a mysql-server安装 PHP 7.4 使用 ondrej/php PPA sudo apt inst…

[java基础揉碎]this

引出this: 什么是this: java虚拟机会给每个对象分配 this&#xff0c;代表当前对象。 这里的this就是new出来的这个对象 this的本质: this是个引用在堆中指向它自己: this的细节: 访问成员方法: 访问构造器:

精英ECS Z97-MACHINE V1.0 BIOS MX25L6406E

官网上的两个BIOS我都无法亮机&#xff0c;这是我保存出来的BIOS&#xff0c;不知道是否能使用五代的处理器 官网&#xff1a;Z97-MACHINE&#xff5c;Motherboard&#xff5c;产品&#xff5c;ECS 精英电脑 国外老哥的看法&#xff1a;ECS Z97-MACHINE Closer Look: The BIO…

Postgresql源码(121)事务状态中childXids的作用

总结 PG的子事务回滚是真回滚&#xff08;直接回滚了&#xff0c;不管顶层事务提交还是回滚&#xff09;。 PG的子事务提交是假提交&#xff08;子事务提交后会把决定权交给顶层事务&#xff0c;随顶层事务提交、回滚&#xff09;。 子事务提交后&#xff0c;将xid记录到父事…

RocketMQ-架构与设计

RocketMQ架构与设计 一、简介二、框架概述1.设计特点 三、架构图1.Producer2.Consumer3.NameServer4.BrokerServer 四、基本特性1.消息顺序性1.1 全局顺序1.2 分区顺序 2.消息回溯3.消息重投4.消息重试5.延迟队列&#xff08;定时消息&#xff09;6.重试队列7.死信队列8.消息语…

【电子书】游戏开发

资料 wx&#xff1a;1945423050 整理了一些互联网电子书&#xff0c;推荐给大家 游戏开发 ADOBE FLASH PROFESSIONAL CS6 标准培训教材.epubAndroid 3D 游戏案例开发大全.epubCocos Creator游戏开发实战.epubCocos2D-X游戏开发技术精解.epubCocos2d-JS游戏开发快速入门到实战…

《Python 语音转换简易速速上手小册》第3章 文本到语音的转换(2024 最新版)

文章目录 3.1 文本到语音的原理3.1.1 基础知识3.1.2 主要案例&#xff1a;自动新闻播报器案例介绍案例 Demo案例分析 3.1.3 扩展案例 1&#xff1a;智能助手案例介绍案例 Demo案例分析 3.1.4 扩展案例 2&#xff1a;电子书阅读器案例介绍案例 Demo案例分析 3.2 Python 中的文本…

[高并发] - 2. 金融交易系统高并发架构

1. 高并发场景 [高并发] - 1. 高并发架构综述 上面文章提到的数据都存在高并发场景。 2. 解决方案 2.1 权限 权限数据的特点是数据量少&#xff08;一千万&#xff09;&#xff0c;占用的空间大小大概在2G左右&#xff0c;但是性能要求极高。权限数据还有个特点&#xff0c;…

python 验证AES_ECB算法对数据的加解密

目录 一、python 代码实现如下&#xff1a; 二、代码解析 三、运行结果 一、python 代码实现如下&#xff1a; #AES_ECB模式实现 from Crypto.Cipher import AES from Crypto.Random import get_random_bytes # 自动生成密钥 from Crypto.Util.Padding import pad, unpad …

开开开开开,干

大家新年快乐&#xff0c;开工啦啦啦啦 其实每天很多人都会问&#xff1a; 有协同过滤的算法吗&#xff0c;有的&#xff0c;可以给你解释原理… 有的小伙伴只开了一部分逻辑&#xff0c;我要实现用户可以下单功能 但是细细考虑下单&#xff0c;需要现有用户&#xff0c;维护…

为全志D1开发板移植LVGL日历控件和显示天气

利用TCP封装HTTP包请求天气信息 Linux还真是逐步熟悉中&#xff0c;现在才了解到Linux即没有原生的GUI&#xff0c;也没有应用层协议栈&#xff0c;所以要实现HTTP应用&#xff0c;必须利用TCP然后自己封装HTTP数据包。本篇即记录封装HTTP数据包&#xff0c;到心知天气请求天气…

Flutter Slider自定义滑块样式 Slider的label标签框常显示

1、自定义Slider滑块样式 Flutter Slider控件的滑块系统样式是一个圆点&#xff0c;thumbShape默认样式是RoundSliderThumbShape&#xff0c;如果想要使用其它的样式就需要自定义一下thumbShape&#xff1b; 例如需要一个上图样式的&#xff08;圆点半透明圆形边框&#xff09…