【Django】ORM增删改查、F对象和Q对象、聚合操作和原生数据库操作

news2024/9/20 17:19:08

1、ORM的增删改查均需要通过管理器对象进行。
2、可使用python3 manage.py shell 进入脚本页方便操作。
3、可修改输出格式在这里插入图片描述

一、ORM查询操作

1、查询方法

在这里插入图片描述

(1)all()方法

  • 用法:MyModel.objects.all()
  • 作用:查询所有数据,等同于select * from table
  • 返回值:QuerySet容器对象,内部存放MyModel实例
from bookstore.models import book
books = Book.objects.all()
for book in books:
    print(book.title)

(2)values(‘列1’,‘列2’)

  • 用法:MyModel.objects.values(...)
  • 作用:查询部分列的数据并返回,等同于select 列1,列2 from xxx
  • 返回值:查询结果的容器,容器内存字典,每个字典代表一条数据,格式为{‘列1’:值1,…}
a2 = Book.objects.values('title','pub')
# a2
'''<QuerySet [{'title': 'Python', 'pub': '清华大学出版社'}, {'title': 'Django', 'pub': '清华大学出版社'}, {'title': 'Jquery', 'pub': '清华大学出版社'}, {'title': 'Linux', 'pub': '机械工业出版社'}, {'title': 'HTML5', 'pub': '机械工业出 版社'}]>'''

for book in a2:
     print(book['title'])

(3)values_list(‘列1’,‘列2’)

  • 用法:MyModel.objects.values_list(...)
  • 作用:查询部分列的数据并返回,等同于select 列1,列2 from xxx
  • 返回值:查询结果的容器,容器内存元组,每个元组代表一条数据,格式为(‘值1’,值2),…

(4)order_by(‘列’)

  1. 用法:MyModel.objects.order_by('-列','列')
  2. 作用:对查询结果进行根据某个字段选择性排序,与sql中的ORDERBY相同
  3. 说明:默认是升序,降序需加’-’
Book.objects.order_by('-price')
'''<QuerySet [<Book: Jquery_清华大学出版社_90.00__85.00>, <Book: HTML5_机械工业出版社_90.00__105.00>, <Book: Linux_机械工业出版社_80.00__65.00>, <Book: Django_清华大学出版社_75.00__70.00>, <Book: Python_清华大学出版社_20.00__25.00>]>'''
Book.objects.values('title').order_by('-price')
''' <QuerySet [{'title': 'Jquery'}, {'title': 'HTML5'}, {'title': 'Linux'}, {'title': 'Django'}, {'title': 'Python'}]>'''
# QuerySet会自动根据mysql的语序执行
Book.objects.order_by('-price').values('title')
''' <QuerySet [{'title': 'Jquery'}, {'title': 'HTML5'}, {'title': 'Linux'}, {'title': 'Django'}, {'title': 'Python'}]>'''
# 可查询到根据何sql语句得到的对象
print(a5.query)
# SELECT `book`.`title` FROM `book` ORDER BY `book`.`price` DESC

小练习:在/bookstore/all_book/路由下用表格展示所有图书的内容

  • 主路由给应用分发路由path('bookstore/',include('bookstore.urls'))
  • bookstore应用下配置目标路由path('all_book/',views.allbook_view)
  • 编写视图函数
from django.http import HttpResponse
from django.shortcuts import render
from .models import Book
# Create your views here.
def allbook_view(request):
    all_book = Book.objects.all().order_by('price')
    return render(request,'bookstore/all_book.html',locals())
  • bookstore应用下创建templates/bookstore文件夹,并创建all_book的html页面
<table border="1px" width="800px" height="100px">
      <tr>
           <th>id</th>
           <th>title</th>
           <th>pub</th>
           <th>info</th>
           <th>price</th>
           <th>market_price</th>
           <th>op</th>
       </tr>
       
       {% for book in all_book %}
       <tr>
           <td>{{ book.id }}</td>
           <td>{{ book.title }}</td>
           <td>{{ book.pub }}</td>
           <td>{{ book.info }}</td>
           <td>{{ book.price }}</td>
           <td>{{ book.market_price }}</td>
           <td>
               <a href="">更新</a>
               <a href="">删除</a>
           </td>
       </tr>
       {% endfor %}
</table>

(5)filter(条件)

  • 语法:MyModel.objects.filter(属性1=值1,属性2=值2)
  • 作用:返回包含此条件的全部数据集
  • 返回值:QuerySet容器对象,内部存放MyModel实例
  • 说明:多个属性的关系为“与”
from bookstore.models import Book
books = Book.objects.filter(pub='清华大学出版社')
for book in books:
	print(book.title)

(6)exclude(条件)

  • 语法:MyModel.objects.exclude(属性1=值1,属性2=值2)
  • 作用:返回不包含此条件的全部数据集
  • 返回值:QuerySet容器对象,内部存放MyModel实例
  • 说明:多个属性的关系为“与”
from bookstore.models import Book
books = Book.objects.exclude(pub='清华大学出版社',price=50)
for book in books:
	print(book.title)

(7)get(条件)

  • 语法:MyModel.objects.get(属性1=值1,属性2=值2)
  • 作用:返回满足条件的唯一一条数据
  • 说明:只能返回一条数据,0或多均报错
from bookstore.models import Book
book = Book.objects.get(pub='清华大学出版社',price=50)
print(book.title)

(8)类名_查询谓词

  • 定义:更灵活的条件查询
  • 说明:每一个查询谓词是一个独立的查询功能
查询谓词解释
__exact等值匹配
__contains包含指定值
__startswith以xxx开始
__endswith以xxx结束
__gt大于指定值
__gte大于等于
__lt小于指定值
__lte小于等于
__in是否在指定范围内(列表)
__range是否在指定区间内(元组)

2、更新操作

(1)更新单个数据

  • 查:通过get()得到要修改的实体对象
  • 改:通过 对象.属性 的方式修改数据
  • 保存:对象.save()保存数据

(2)批量数据更新

  • 直接调用QuertSet的update(属性=值)实现批量修改
books = Book.object.filter(id__gt=3)
books.update(price=0)

小练习:在all_book路由基础上增加更改功能

在/bookstore/update_book/1页面修改书籍的价格.

  1. 编写视图函数
def update_book(request,book_id):
    try:
        book = Book.objects.get(id = book_id)
    except Exception as e:
        print('---update book error is',e)
        return HttpResponse('alter("The book is not existed")')

    if request.method == 'GET':
        return render(request,'bookstore/update_book.html',locals())
    elif request.method == 'POST':
        pass
  1. 配置路由与a标签
path('update_book/<int:book_id>',views.update_book)
<a href="/bookstore/update_book/{{ book.id }}">更新</a>
  1. 编写html页面
<form action='/bookstore/update_book/{{ book.id }}' method='post'>
    title 
    <input type='text' value="{{ book.title }}" readonly>
    <br>
    pub 
    <input type='text' value="{{ book.pub }}" readonly>
    <br>
    info 
    <input type='text' value="{{ book.info }}" readonly>
    <br>
    price 
    <input type='text' name="price" value="{{ book.price }}">
    <br>
    market_price 
    <input type='text' name="market_price" value="{{ book.market_price }}" >
    <br>
    <input type="submit" value='确认修改'>
</form>
  1. 完善视图函数post部分
elif request.method == 'POST':
    price = request.POST['price']
    market_price = request.POST['market_price']
    book.price= price
    book.market_price= market_price
    book.save()
    return HttpResponseRedirect('/bookstore/all_book')

3、删除操作

(1)单个数据删除

  1. 查找查询结果对应的数据对象
  2. 调用delete()方法实现删除
auth = Author.objects.get(id=1)
auth.delete()

(2)批量数据删除

  1. 查找查询结果满足条件的所有数据对象
  2. 调用集合对象的delete()方法实现删除
auth = Author.objects.filter(age__gt=65)
auth.delete()

一般都会做“伪删除”,即is_active字段为False

小练习:增加伪删除书籍的功能

路由/bookstore/delete_book?book_id=xxx,相关查询获取数据的地方要过滤出活跃数据。

  1. 配置路由与a标签
path('delete_book',views.delete_book)
<a href="/bookstore/delete_book?book_id={{book.id}}">删除</a>
  1. 编写视图函数
def delete_book(request):
    # 通过查询字符串获取book_id
    book_id = request.GET.get('book_id')
    if not book_id:
        return HttpResponse("The book is not existed")
    try:
        book = Book.objects.get(id = book_id,is_active=True)
    except Exception as e:
        print('---delete book error is',e)
        return HttpResponse("The book is not existed")
    book.is_active = False
    book.save()
    return HttpResponseRedirect('/bookstore/all_book')

二、F对象和Q对象

1、F对象

  • F对象代表数据库中某条记录的字段信息
  • 作用:在不获取的情况下,对数据库中的字段操作。
from django.db.models import F
F('列名')
Book.objects.all().update(market_price=F('market_price')+10)
Book.objects.filter(market_price__gt=F('price'))

注:比起读取再修改,F对象相当于上了一把锁,多人操作也不会造成竞争。

2、Q对象

Q对象可以操作复杂的逻辑(与&或|非~操作)

from django.db.models import Q
# 找出定价低于20元 或 清华大学出版社的全部书
Book.objects.filter(Q(price__lt=20)|Q(pub='清华大学出版社'))
# 查找不是机械工业出版社的书且价格低于50的书
Book.objects.filter(Q(market_price__t=50) &~Q(pub_house='机械工业出版社'))

三、聚合查询和原生数据库操作

1、聚合查询

(1)整表聚合

  1. 导入方法:from django.db.models import *
  2. 聚合函数:Sum,Avg,Count,Max,Min
  3. 语法:Mymodel.objects.aggregate(结果变量名=聚合函数('列'))
  4. 返回结果:{‘结果变量名’:值}
Book.objects.aggregate(sumprice=Sum('price'))
# {'sumprice': Decimal('317.00')}

(2)分组聚合-先分组再聚合

  1. 通过查询values找到要分组聚合的列 MyModel.objects.values('列1','列2')
  2. 通过返回结果的QuerySet.annotate方法 QuerySet.annotate(名=聚合函数('列'))
pub_set = Book.objects.values('pub')
pub_count_set = pub_set.annotate(myCount=Count('pub'))
# <QuerySet [{'pub': '清华大学出版社', 'myCount': 3}, {'pub': '机械工业出版社', 'myCount': 2}]>

2、原生数据库操作

  • 直接用sql语句的方式进行数据库通信

(1)直接raw方法

  • 语法:MyModel.objects.raw(sql语句,拼接参数)
  • 返回值:RawQuerySet集合对象(只支持循环等基础操作)
  • 不推荐原因:有SQL注入问题(用户通过数据上传,将恶意的sql语句提交给服务器,从而达到攻击效果)

在这里插入图片描述

# 案例1,用户在搜索好友的表单框里输入'1 or 1=1',可查询出所有用户数据
books = Book.objects.raw('select * from book where id=%s'%('1 or 1=1'))
# 正确写法
books = Book.objects.raw('select * from book where id=%s',['1 or 1=1'])

(2)游标cursor

  1. 导入cursor所在的包 from django.db import connection
  2. 用创建cursor类的构造函数创建cursor对象
from django.db import connection
# with语句可保证在出现异常时释放cursor资源
with connection.cursor() as cur:
	cur.execute('sql语句','拼接参数')

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

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

相关文章

微信小程序——自定义组件(纯数据字段),组件的生命周期,组件所在页面的生命周期,插槽,父子组件之间的通信,事件绑定,属性绑定,behavior

一.纯数据字段1.什么是纯数据字段概念&#xff1a;纯数据字段指的是那些不用于界面渲染的data字段。应用场景&#xff1a;例如有些情况下&#xff0c;某些 data 中的字段既不会展示在界面上&#xff0c;也不会传递给其他组件&#xff0c;仅仅在当前组件内部使用。带有这种特性的…

《Keras深度学习:入门、实战与进阶》之回归问题实例:波士顿房价预测

本文摘自《Keras深度学习&#xff1a;入门、实战与进阶》。 本节将要预测20世纪70年代中期波士顿郊区房屋价格的中位数。这个数据是1978年统计收集的&#xff0c;数据集中的每一行数据都是对波士顿周边或城镇房价的描述&#xff0c;包含以下14个特征和506条数据。  CRIM&am…

verilog图像算法实现和仿真(代码与实践)

【声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 这里的代码指的是verilog代码,而不是之前的python代码。因为verilog处理的是数据,所以之前我们也谈到过,如果需要用verilog处理图像数据,需要先用python把图像变成文本文件,等到…

菜鸟的进阶--手写一个微型Spring

前言想干嘛深入了解spring原理&#xff0c;特别是IOC容器是如何实现的&#xff1f;AOP是如何实现的&#xff1f;手写一个spring迷你版框架&#xff0c;实现容器和AOP机制。我为什么想这么做spring是整个java体系中最重要的框架&#xff0c;它整合第三方技术&#xff0c;将所有的…

交联剂134272-64-3,Maleimide-NH2 HCl,2-马来酰亚胺乙胺盐酸盐

【中文名称】N-(2-氨乙基)马来酰亚胺盐酸盐&#xff0c;2-马来酰亚胺乙胺盐酸盐【英文名称】 MAL-NH2 HCl&#xff0c;Maleimide-NH2 HCl&#xff0c;MAL NH2 HCl&#xff0c;Maleimide-amine HCl&#xff0c;MAL-amine HCl&#xff0c;N-(2-AMinoethyl)MaleiMide Hydrochlorid…

5年老测试员,面试被刷,别人说他不懂自动化测试.....

圈内认识的朋友最近跳槽了&#xff0c;之前在一家小公司干了5年测试&#xff0c;本来以为很容易跳一个高待遇的工作&#xff0c;结果却比想象的难&#xff0c;因为他不会自动化测试… 最近也看了很多人的简历&#xff0c;写的都是3年工作经验&#xff0c;但面试中&#xff0c…

对数据库几个范式的理解

数据库关系理论 这部分主要是几个概念很抽象&#xff0c;大家开始学可能学不明白。最近在准备复试&#xff0c;复习了一下相关的内容&#xff0c;顺便做一下总结。 先说几个名词&#xff1a; 候选码&#xff1a;能够唯一确定一个元组的属性集合称为候选码。注意是集合&#…

每日学术速递2.3

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.Cv、cs.LG 1.Compositional Prompt Tuning with Motion Cues for Open-vocabulary Video Relation Detection(ICLR 2023) 标题&#xff1a;通过基于错误的隐性神经表征的上下文修剪实现高…

Java基础学习笔记(十五)—— 集合(3)

集合1 HashMap 类1.1 HashMap 类概述1.2 HashMap 案例2 TreeMap 类2.1 TreeMap 类概述2.2 TreeMap 案例3 Properties集合3.1 Properties集合概述3.2 Properties基本使用3.3 Properties特有方法3.4 Properties和IO流相结合的方法4 可变参数与不可变集合4.1 可变参数4.2 不可变集…

2023.1.26

0、任务 今明两天任务&#xff0c;回答以下问题&#xff1a; 1、网络传输延迟有哪些&#xff1f;如何区分传输延迟和排队延迟&#xff1f; 2、如何理解路由器存储转发的过程&#xff1f; 3、拥塞是什么&#xff0c;为什么会发生拥塞&#xff0c;发生拥塞的表现是什么&#xff…

网络资源下载方式:http/https、ftp/sftp、BT种子、磁力下载、ed2k下载等的区别

文章目录参考资料序言中心化下载http/https下载ftp/sftp下载http与ftp下载方式的不同中心化下载的缺点中心化下载BT种子下载磁力下载ed2k下载推荐的下载器IDM下载器安装步骤IDM如何下载种子文件参考资料 一文读懂Bt种子、磁力链接、直链、p2p这些下载的区别 常说的BT下载、磁力…

【数据结构基础】图 - 基础和Overview

图(Graph)是由顶点和连接顶点的边构成的离散结构。在计算机科学中&#xff0c;图是最灵活的数据结构之一&#xff0c;很多问题都可以使用图模型进行建模求解。例如: 生态环境中不同物种的相互竞争、人与人之间的社交与关系网络、化学上用图区分结构不同但分子式相同的同分异构体…

情人节该送女友什么?分享四款适合送女生的数码好物

情人节快到了&#xff0c;对于有伴侣的人来说&#xff0c;这是一个浪漫的日子。在这个浪漫的日子&#xff0c;一些生活仪式感是必不可少的。最近看到不少人问&#xff0c;适合女生的数码好物有哪些&#xff1f;下面&#xff0c;我来给大家推荐几款适合送女生的数码好物&#xf…

动态规划DP与记忆化搜索DFS 题单刷题(c++实现+AC代码)

文章目录数字三角形滑雪挖地雷最大食物链计数采药疯狂的采药5倍经验值过河卒洛谷动态规划入门题单&#xff1a; 提单传送门 数字三角形 观察下面的数字金字塔。写一个程序来查找从最高点到底部任意处结束的路径&#xff0c;使路径经过数字的和最大。每一步可以走到左下方的点也…

“深度学习”学习日记。卷积神经网络--卷积层

2023.2.3 CNN中出现一些新的概念&#xff1a;填充、步幅 等&#xff0c;此外各层中传递的数据是有形状的&#xff0c;与之前的全连接层神经网络完全不同&#xff1b; 一、全连接层存在的问题&#xff1a; 全连接层神经网络使用了Affine层&#xff0c;在相邻的神经元全部连接…

php7.3.4 pdo方式连接sqlserver 设置方法

我这边用的php是7.3.4版本的&#xff0c;大家设置的时候看一下。一、首先要开启php的sqlsrv扩展1.下载SQLSRV58.EXE,我的php版本是7.3.4https://docs.microsoft.com/en-us/sql/connect/php/release-notes-php-sql-driver?viewsql-server-2017#previous-releases拷贝到浏览器打…

内网渗透(二)之基础知识-工作组介绍

系列文章 内网渗透(一)之基础知识-内网渗透介绍和概述 注&#xff1a;阅读本编文章前&#xff0c;请先阅读系列文章&#xff0c;以免造成看不懂的情况&#xff01;&#xff01; 工作组介绍 1、工作组的介绍 在一个大型单位里,可能有成百上千台计算机互相连接组成局域网,它…

Rancher 部署 MongoDB

文章目录前置部署创建 Headless开始部署测试前置 背景&#xff1a;在 K8S 集群用 bitnami 部署 MongoDB 有一定的学习成本&#xff0c;有兴趣可以参考 k8s 部署 mongodb 三种模式&#xff0c;且部署后发现 MongoDB 会随着时间推移占用越来越多的内存&#xff0c;暂没找到原有&…

计算机如何在本地硬盘安装WinPE系统

环境&#xff1a; 联想E14 Win 10专业版 U盘魔术师V6 30G硬盘分区 双硬盘&#xff1a;128G固&#xff0b;1T机 DiskGenius UltraISO 问题描述&#xff1a; 如何在本地硬盘安装WinPE系统 解决方案&#xff1a; 一、使用软件制作硬盘PE系统 1.机械磁盘先分区分一个30G分区 …

Java 中的Type类型及其实现【学习记录】

概述 在JDK1.5之前只有原始类型&#xff0c;此时所有的原始类型都通过字节码文件类Class进行抽象。Class类的一个具体对象就代表一个指定的原始类型。 JDK1.5加入了泛型类&#xff0c;扩充了数据类型&#xff0c;从只有原始类型基础上扩充了参数化类型、类型变量类型、通配符…