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 os
        def main():
            os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day59.settings')
            import django   # 这个导入模块不能写到外面去
            django.setup()

            from app01 import models
            print(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.mfbz.cn/a/400507.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

盲水印、暗水印(Blind Watermark)算法简明教程:算法原理、流程以及基于C/C++ 的代码实现

前言 由于工作需要,最近学习了盲水印相关的知识,本文对学习过程中做一个整理和总结。主要内容包括: 对盲水印相关概念做基本介绍对开源的 python 算法 blind_watermark 进行解析,给出算法流程基于 blind_watermark,给…

qt - 19种精美软件样式

qt - 19种精美软件样式 一、效果演示二、核心程序三、下载链接 一、效果演示 二、核心程序 #include "mainwindow.h"#include <QtAdvancedStylesheet.h> #include <QmlStyleUrlInterceptor.h>#include "ui_mainwindow.h" #include <QDir&g…

提高工作效率,体验ONLYOFFICE办公软件

ONLYOFFICE办公软件 一、前言二、特点完整办公套件协作过程更容易 三、访问地址 一、前言 随着数字化办公的普及&#xff0c;办公软件在我们的工作中扮演着越来越重要的角色。为了提高工作效率&#xff0c;我们需要一个功能强大、易于使用的办公软件。ONLYOFFICE作为一款全功能…

如何通过SQL语句获取表/视图的DDL,表/列/索引的统计信息,查询的执行计划(MySQL)

文章目录 获取对象的定义SQL语句列出库中的表和视图表的DDL语句索引的DDL语句视图的DDL语句物化视图的DDL语句 获取统计信息的SQL语句表级统计信息索引统计信息列级统计信息 获取执行计划的Explain语句ExplainExplain JsonExplain Tree (8.0.16及以上)Explain Analyze (8.0.18及…

Java语言实现五子棋

目录 内容 题目 解题 代码 实现 内容 题目 五子棋 使用二维数组,实现五子棋功能. 1.使用二维数组存储五子棋棋盘 如下图 2.在控制台通过Scanner输入黑白棋坐标(例如:1,2 2,1格式 表示二维数组坐标),使用实心五角星和空心五角星表示黑白棋子. 如下图: 输入后重新输出…

解决方案——文本生成图像DF-GAN配置Oxford-102 Flower 花数据集全流程

目录 一、Oxford-102 Flower简介二、DF-GAN配置Oxford-102 Flower 数据集2.1、下载数据集2.2、配置数据集 三、修改代码四、资源下载 一、Oxford-102 Flower简介 Oxford-102 Flower是牛津工程大学于2008年发布的用于图像分类的花卉数据集&#xff0c;原论文链接&#xff1a;Au…

适配器模式:转换接口,无缝对接不同系统

文章目录 **一、技术背景与应用场景****为什么使用适配器模式&#xff1f;****典型应用场景包括但不限于&#xff1a;** **二、适配器模式定义与结构****三、使用步骤举例****四、优缺点分析****总结** 一、技术背景与应用场景 适配器模式在软件设计中扮演着桥梁角色&#xff…

.zip文件如何在centos7解压

在CentOS 7中解压.zip文件&#xff0c;您可以使用unzip命令。如果您的系统上没有安装unzip工具&#xff0c;您首先需要安装它。以下是步骤指南&#xff1a; 安装unzip工具 打开终端并运行以下命令来安装unzip&#xff1a; sudo yum install unzip解压.zip文件 安装unzip之后&am…

2023年12月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 运行以下程序,输出的结果是?( ) class A():def __init__(self,x):self.x=x

leetcode hot100组合综合四

本题中&#xff0c;是要求nums中求的总和为target的排列数&#xff0c;因为题中说了&#xff0c;元素顺序不同&#xff0c;则可以视为不同的结果之一。 所以&#xff0c;根据对背包问题的总结&#xff0c;本题中元素可以重复使用&#xff0c;是完全背包并且需要求排列数&#…

多线程——threading和queue模块的理解。加实例+详解+思路

并发&#xff1a;假的多任务 并行&#xff1a;真的多任务 实现多线程用——threading模块 import threading import timedef shuru():for i in range(1,4):print("正在输入")time.sleep(1) def shuchu():for i in range(1,4):print("正在输出")time.sle…

通俗易懂的双亲委派机制

当你超过别人一点点&#xff0c;别人会嫉妒你&#xff1b;当你超过别人一大截&#xff0c;别人就会羡慕你 据说给我点关注的都成了大佬&#xff0c;点关注的我都会私发一份好东西 ​​​​你得先知道 在介绍双亲委派机制的时候&#xff0c;不得不提ClassLoader&#xff08;类…

Windows / Linux dir 命令

Windows / Linux dir 命令 1. dir2. dir *.* > data.txt3. dir - list directory contentsReferences 1. dir 显示目录的文件和子目录的列表。 Microsoft Windows [版本 10.0.18363.900] (c) 2019 Microsoft Corporation。保留所有权利。C:\Users\cheng>dir驱动器 C 中…

xxl-job架构原理讲解

1、调度中心 调度中心是一个单独的Web服务&#xff0c;主要是用来触发定时任务的执行 它提供了一些页面操作&#xff0c;我们可以很方便地去管理这些定时任务的触发逻辑 调度中心依赖数据库&#xff0c;所以数据都是存在数据库中的 调度中心也支持集群模式&#xff0c;但是…

mybatis数据操作语句

//基于注解 Mapper public interface reboudapt {Select("select * from dept")List<dept> huoqudept();//删除语句Delete("delete from dept where id #{id}")void deletesc(Integer id);//增加语句Insert("insert into dept(name, create_t…

【flutter】第一个flutter项目

前言 我们通过Android Studio来创建flutter项目。 安装dart和flutter插件 新版编译器需要先安装flutter插件才能构建flutter项目。 项目目录 我们基本就在lib中写代码 项目启动

PiflowX-组件UnionAll

UnionAll组件 组件说明 Union多个输入源。输入源必须具有相同的字段类型。 计算引擎 flink 组件分组 common 端口 Inport&#xff1a;Any outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子inportsInports“”无否Inports string are…

C# 使用onnxruntime部署夜间雾霾图像的可见度增强

目录 介绍 模型信息 效果 项目 代码 下载 C# Onnx 使用onnxruntime部署夜间雾霾图像的可见度增强 介绍 github地址&#xff1a;GitHub - jinyeying/nighttime_dehaze: [ACMMM2023] "Enhancing Visibility in Nighttime Haze Images Using Guided APSF and Gradien…

机器视觉系统选型-为什么还要选用工业光源控制器

工业光源控制器最主要的用途是给光源供电&#xff0c;实现光源的正常工作。 1.开关电源启动时&#xff0c;电压是具有波浪的不稳定电压&#xff0c;其瞬间峰值电压超过了LED灯的耐压值&#xff0c;灯珠在多次高压冲击下严重降低了使用寿命&#xff1b; 2.使用专用的光源控制器&…

day2:信号与槽

思维导图 使用手动连接&#xff0c;将登录框中的取消按钮使用t4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断u界面上输入的账号是否为"123",密码是否为"…
最新文章