汝州住房和城乡建设网站,网页微信版登陆,典当行网站模板,wordpress dux5.1查询数据
通过 MyModel.objects 管理器方法调用查询接口#xff0c;查询数据库
方法说明all()查询全部记录,返回QuerySet查询对象get()查询符合条件的单一记录filter()查询符合条件的多条记录exclude()查询符合条件之外的全部记录
all()方法
MyModel.objects.all()
查询M…查询数据
通过 MyModel.objects 管理器方法调用查询接口查询数据库
方法说明all()查询全部记录,返回QuerySet查询对象get()查询符合条件的单一记录filter()查询符合条件的多条记录exclude()查询符合条件之外的全部记录
all()方法
MyModel.objects.all()
查询MyModel实体中所有的数据等同于 select * from tabel; 返回值: QuerySet容器对象内部存放 MyModel 实例
from bookstore.models import Book
books Book.objects.all()
for book in books:print(书名, book.title, 出版社:, book.pub)[rootvm mysite2]# python3 manage.py shellfrom bookstore.models import Bookbooks Book.objects.all()for book in books:
... print(书名:, book.title, 价格:, book.price,出版社:, book.pub)
...
书名: java 价格: 50.00 出版社: for book in books:
... print(book)
...
Book object (1)
Book object (2)#数据库信息
-------------------------------------
| id | title | price | market_price | pub |
-------------------------------------
| 1 | java | 50.00 | 0.00 | |
-------------------------------------
返回自定义字符串
在模型类中重写__str__ 方法,实现自定义默认的字符串
[rootvm mysite2]# vim bookstore/models.pyclass Book(models.Model):title ...def __str__(self):info 书名: %s, 出版社: %s, 定价: %s % (self.title, self.pub, self.price)return info#重新登录终端
[rootvm mysite2]# python3 manage.py shellfrom bookstore.models import Bookbooks Book.objects.all()for book in books:
... print(book)
...
书名: java, 出版社: , 定价: 50.00
书名: python, 出版社: 清华, 定价: 50.00查询返回指定列(字典表示)
用法: MyModel.objects.values(列1,列2…) 作用: 查询部分列的数据并返回同select 列1,列2 from xxx 返回值: QuerySet返回查询结果容器容器内存字典每个字典代表一条数据格式为: {‘列1’: 值1, ‘列2’: 值2}
from bookstore.models import Book
books Book.objects.values(title, pub)
for book in books:print(书名, book[title], 出版社:, book[pub])print(book, book)#打印
书名 java 出版社:
book {title: java, pub: }
书名 python 出版社: 清华
book {title: python, pub: 清华}
...查询返回指定列元组表示)
用法:MyModel.objects.values_list(列1,列2…) 作用:返回元组形式的查询结果返回值: QuerySet容器对象内部存放元组 会将查询出来的数据封装到元组中,再封装到查询集合QuerySet中
from bookstore.models import Book
books Book.objects.values_list(title, pub)
for book in books:print(书名, book[0], 出版社:, book[1])print(book, book)#打印
书名 java 出版社:
book (java, )
书名 python 出版社: 清华
book (python, 清华)... 排序查询 order_by
方法:order_by用法:MyModel.objects.order_by(‘-列’,‘列’)作用: 用SQL 语句的ORDER BY对查询结果根据某个字段选择性的进行排序。默认是按照升序排序,降序排序则需要在列前增加’-表示
from bookstore.models import Book
books Book.objects.order_by(-price)
for book in books:print(书名:, book.title, 定价:, book.price)书名: xiyou 定价: 700.00
书名: c 定价: 100.00
书名: honglou 定价: 90.00 条件查询 - filter 方法: filter(条件)语法: MyModel.objects.filter(属性1值1, 属性2值2) 返回值QuerySet容器对象,内部存放 MyModel 实例 说明: 当多个属性在一起时为与关系
# 查询书中出版社为清华大学出版社的图书
from bookstore.models import Book
books Book.objects.filter(pub清华,price100)
for book in books:print(书名:, book.title)书名: c# 查询Author实体中name为王老师并且age是28岁的authorsAuthor.objects.filter(name王老师,age28)条件查询 - get 方法: get(条件) 语法: MyModel.objects.get(条件) 作用返回满足条件的唯一一条数据编码时一定要加try。 说明: 该方法只能返回一条数据 - 查询结果多余一条数据则抛出,Model.MultipleObjectsReturned异常
- 查询结果如果没有数据则抛出Model.DoesNotExist异常使用 from bookstore.models import Bookbook Book.objects.get(id1)print(book)
书名: java, 出版社: , 定价: 50.00print(book.title)
java#报错book Book.objects.get(id9)
...
bookstore.models.Book.DoesNotExist: Book matching query does not exist. book Book.objects.get(pub清华)
...
bookstore.models.Book.MultipleObjectsReturned: get() returned more than one Book -- it returned 2!
对比filter和get方法
filter()方法返回的是QuerySet类型可以有0个、1个、多个对象。
get()方法返回的是一个模型类的对象只能返回1个对象0个或多个将会报错所以对于get方法编码时一定要加try。 条件查询 - exclude
方法: exclude(条件) 语法: MyModel.objects.exclude(条件)作用:返回不包含此 条件的 全部的数据集
#查询 清华 出版社定价等于50以外的全部图书books Book.objects.exclude(pub清华, price50)for book in books:
... print(book)使用orm做数据的查询注意 MyModel.objects.all();MyModel.objects.values();MyModel.objects.values_list();MyModel.objects.get(); MyModel.objects.filter();MyModel.objects.exclude(); MyModel.objects.order_by();只有get返回单个对象其他返回的是QuerySet容器。values返回的容器中的元素是字典values_list则是元组其他都是对象 查询谓词
每一个查询谓词是一个独立的查询功能
__exact : 等值匹配
Author.objects.filter(id__exact1) #等同id1
# 等同于select * from author where id 1__contains : 包含指定值
Author.objects.filter(name__containsw)
# 等同于 select * from author where name like %w%__startswith : 以 XXX 开始
__endswith : 以 XXX 结束
__gt : 大于指定值
Author.objects.filer(age__gt50)
# 等同于 select * from author where age 50__lt : 小于
__gte : 大于等于
__lte : 小于等于__in : 指定范围内
Author.objects.filter(country__in[中国,日本,韩国])
# 等同于 select * from author where country in (中国,日本,韩国)__range : 指定的区间范围内
# 查找年龄在某一区间内的所有作者包含边界值
Author.objects.filter(age__range(35,50))
# 等同于 SELECT ... WHERE Author BETWEEN 35 and 50;详细内容参见: https://docs.djangoproject.com/en/2.2/ref/models/querysets/#field-lookups
修改数据
修改单个实体的某些字段值的步骤:
查通过 get() 得到要修改的实体对象改通过 对象.属性 的方式修改数据存通过 对象.save() 保存数据 from bookstore.models import Bookabook Book.objects.get(id1)print(abook.price)
50.00abook.price 10.5abook.save()print(abook.price)
10.5通过 QuerySet 批量修改 对应的全部字段
直接调用QuerySet的update(属性值) 实现批量修改 也可批量改一条
返回值更新数据的数量
# 将id大于3的所有图书价格定为0元
books Book.objects.filter(id__gt3)
books.update(price0)# 将所有书的零售价定为100元
books Book.objects.all()
books.update(market_price100)删除数据
删除记录是指删除数据库中的一条或多条记录删除单个MyModel对象或删除一个查询结果集(QuerySet)中的全部对象都是调用 delete()方法
删除单个对象
查找查询结果对应的一个数据对象调用这个数据对象的delete()方法实现删除
try:auth Author.objects.get(id1)auth.delete()
except:print(删除失败)删除查询结果集
查找查询结果集中满足条件的全部QuerySet查询集合对象调用查询集合对象的delete()方法实现删除生成一条sql执行
# 删除全部作者中年龄大于65的全部信息
auths Author.objects.filter(age__gt65)
auths.delete()图书管理系统搭建
(结合页面完成增删改查)
查询功能url: http://127.0.0.1:8000/bookstore/booksview: views.books_view html bookstore/books.htmlmodels: Book类添加功能url: http://127.0.0.1:8000/bookstore/add_bookview: views.add_book html bookstore/add_book.htmlmodels: Book类
预览添加图书
ID 书名 出版社 定价 零售价 操作
1 java 10.50 0.00 修改 删除
...[rootvm ~]# mysql -uroot -p123456 -e select * from mysite2.bookstore_book
-------------------------------------------
| id | title | price | market_price | pub |
-------------------------------------------
| 1 | java | 50.00 | 0.00 | |
| 2 | python | 50.00 | 0.00 | 清华 |
| 3 | c | 100.00 | 0.00 | 清华 |
| 4 | xiyou | 700.00 | 0.00 | beida |
| 5 | honglou | 90.00 | 0.00 | beida |
-------------------------------------------
回顾下之前创建好的配置
[rootvm mysite2]# python3 manage.py startapp bookstore
[rootvm mysite2]# vim mysite2/settings.pyINSTALLED_APPS [
...bookstore,[rootvm mysite2]# vim bookstore/models.pyclass Book(models.Model):title models.CharField(书名, max_length50, default)price models.DecimalField(定价, max_digits7, decimal_places2, default0.0)# 新增属性/字段 要有默认值market_price models.DecimalField(零售价,max_digits5,decimal_places2,default0.0)pub models.CharField(出版社, max_length50,default)def __str__(self):info 书名: %s, 出版社: %s, 定价: %s % (self.title, self.pub, self.price)return info
新增bookstore/books.html配置
[rootvm mysite2]# vim bookstore/urls.py
from django.urls import path
from . import viewsurlpatterns [path(books,views.books_view),
][rootvm mysite2]# vim bookstore/views.py
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from .models import Book# Create your views here.
def add_book(request):books Book.objects.all()return render(request,bookstore/books.html,locals())[rootvm mysite2]# mkdir -p bookstore/templates/bootstore
[rootvm mysite2]# vim bookstore/templates/bootstore/books.html
!DOCTYPE html
html langen
headmeta charsetUTF-8title图书列表/title
/head
body
/body
/htmlhttp://192.168.1.11:8000/bookstore/books #访问验证路由#补充books.html功能
#href/bookstore/add_book bookstore前加/ 从/ 不加是当前页面
!DOCTYPE html
html langen
headmeta charsetUTF-8title图书列表/title
/head
body
a href/bookstore/add_book添加图书/a
tabletrthID/thth书名/thth出版社/thth定价/thth零售价/thth操作/th/tr{% for book in books %}trtd{{ book.id }}/tdtd{{ book.title }}/tdtd{{ book.pub }}/tdtd{{ book.price }}/tdtd{{ book.market_price }}/tdtda href#修改/aa href#删除/a/td/tr{% endfor %}
/table
/body
/html写添加功能/bookstore/add_book
[rootvm mysite2]# vim mysite2/urls.pyurlpatterns [path(add_book/,include(add_book.urls)),[rootvm mysite2]# vim bookstore/urls.py
from django.urls import path
from . import viewsurlpatterns [path(add_book,views.add_book),
][rootvm mysite2]# vim bookstore/views.py
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from .models import Book# Create your views here.
def add_book(request):if request.method GET:# 返回添加图书的页面return render(request,bookstore/add_book.html)elif request.method POST:# return HttpResponse(添加图书成功) #结合下方完整的add_book.html验证逻辑#OK了再注释写下面的功能# 1.获取用户在add_book.html表单控件中输入的数据title request.POST[title]pub request.POST[pub]price request.POST[price]market_price request.POST[market_price]# 2. 检查数据...# 3.添加到数据库Book.objects.create(titletitle,pubpub,priceprice,market_pricemarket_price)# 重定向到图书列表return HttpResponseRedirect(/bookstore/books)[rootvm mysite2]# vim bookstore/templates/bootstore/add_book.html
#先验证title再设计form表单
!DOCTYPE html
html langen
headmeta charsetUTF-8title添加图书/title
/head
body
form action/bookstore/add_book methodpostp书名:input typetext nametitle/pp出版社:input typetext namepub/pp定价:input typetext nameprice/pp零售价:input typetext namemarket_price/ppinput typesubmit value添加/p
/form
/body
/html修改和删除 通过浏览器地址栏向服务器传参方式有哪些1. path转换器2. 查询字符串
修改功能url: http://127.0.0.1:8000/bookstore/update_book/1view: views.update_book html bookstore/update_book.htmlmodels: Book类
删除功能 url: http://127.0.0.1:8000/bookstore/del_book?bid1view: views.del_book html bookstore/del_book.htmlmodels: Book类从业务角度谈谈删除问题1. 真正删除时一般要有提示信息防止误删。2. 标记删除。常用不是把数据真正的从数据库中删除掉而是增加一个标记以示区分。[rootvm mysite2]# vim bookstore/urls.py
from django.urls import path
from . import views
urlpatterns [path(books,views.books_view),path(add_book,views.add_book),path(update_book/int:bid,views.update_book),#使用了path转换器与查询字符串选其中一个使用path(del_book,views.del_book),
][rootvm mysite2]# vim bookstore/views.py
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import renderfrom .models import Book# Create your views here.
def books_view(request):books Book.objects.all()return render(request,bookstore/books.html,locals())def add_book(request):if request.method GET:# 返回添加图书的页面return render(request,bookstore/add_book.html)elif request.method POST:# 1.获取用户在表单中输入的数据title request.POST[title]pub request.POST[pub]price request.POST[price]market_price request.POST[market_price]# 2. 检查数据...# 3.添加到数据库Book.objects.create(titletitle,pubpub,priceprice,market_pricemarket_price)# return HttpResponse(添加图书成功)# 重定向到图书列表return HttpResponseRedirect(/bookstore/books)def update_book(request, bid):# 根据bid从数据库中获取要修改的book对象# get加trytry:book Book.objects.get(idbid)except:return HttpResponse(图书编号有误)if request.method GET:return render(request,bookstore/update_book.html,locals())elif request.method POST:# 1查【2改3保存】# 获取用户输入的新的数据给属性赋值title request.POST[title]pub request.POST[pub]price request.POST[price]market_price request.POST[market_price]book.title titlebook.pub pubbook.price pricebook.market_price market_price# 保存book.save()# return HttpResponse(修改图书成功)# 重定向到图书列表return HttpResponseRedirect(/bookstore/books)def del_book(request):# 1.根据查询字符串获取图书ID.bid request.GET.get(bid)# 2.根据图书ID获取图书对象try:book Book.objects.get(idbid)# 3.直接执行delete操作book.delete()except:return HttpResponse(图书ID有误)# 4. 重定向到列表页return HttpResponseRedirect(/bookstore/books)
[rootvm mysite2]# vim bookstore/templates/bookstore/books.html
!DOCTYPE html
html langen
headmeta charsetUTF-8title图书列表/title
/head
body
a href/bookstore/add_book添加图书/a
tabletrthID/thth书名/thth出版社/thth定价/thth零售价/thth操作/th/tr{% for book in books %}trtd{{ book.id }}/tdtd{{ book.title }}/tdtd{{ book.pub }}/tdtd{{ book.price }}/tdtd{{ book.market_price }}/tdtda href/bookstore/update_book/{{ book.id }}修改/aa href/bookstore/del_book?bid{{ book.id }}删除/a/td/tr{% endfor %}
/table
/body
/html[rootvm mysite2]# vim bookstore/templates/bookstore/update_book.html
!DOCTYPE html
html langen
headmeta charsetUTF-8title修改图书/title
/head
body
form action/bookstore/update_book/{{ book.id }} methodpostp书名:input typetext nametitle value{{ book.title }}/pp出版社:input typetext namepub value{{ book.pub }}/pp定价:input typetext nameprice value{{ book.price }} /pp零售价:input typetext namemarket_price value{{ book.market_price }} /ppinput typesubmit value修改/p
/form
/body
/html小的项目管理 cMTV 运维数据整理企业级的项目前端T 基于文档json格式数据RESTful 接口规范跨域问题解决后端cMV python web 聚合查询
聚合查询是指对一个数据表中的一个字段的数据进行部分或全部进行统计查询,查bookstore_book数据表中的全部书的平均价格查询所有书的总个数等,都要使用聚合查询
不带分组聚合
不带分组的聚合查询是指导将全部数据进行集中统计查询聚合函数【需要导入】聚合函数有: Sum, Avg, Count, Max, Min
from django.db.models import *
MyModel.objects.aggregate(结果变量名聚合函数(列))返回结果由 结果变量名和值组成的字典
# 得到所有书的平均价格
from bookstore.models import Book
from django.db.models import *
result Book.objects.aggregate(myAvgAvg(price))
print(result, result) # result {myAvg: Decimal(189.700000)}
print(平均价格是:, result[myAvg]) #平均价格是: 189.700000# 得到数据表里有多少本书
from django.db.models import Count
result Book.objects.aggregate(mycntCount(title))
print(result, result) #result {mycnt: 5}
print(数据记录总个数是:, result[mycnt]) #数据记录总个数是: 5
分组聚合走两步
分组聚合是指通过计算查询结果中每一个对象所关联的对象集合从而得出总计值(也可以是平均值或总和)即为查询集的每一项生成聚合。
1、通过先用查询结果MyModel.objects.values 查找查询要分组聚合的列返回 QuerySet 结果集,内部存储结果的字典
MyModel.objects.values(列1, 列2)pub_set Book.objects.values(pub)
print(pub_set) # QuerySet [{pub: 清华}, {pub: 清华}, {pub: 清华}, {pub: beida}, {pub: beida}]2、通过返回结果的 QuerySet.annotate 方法分组聚合得到分组结果
QuerySet.annotate(结果变量名聚合函数(列))pub_count_set pub_set.annotate(myCountCount(pub),mysumSum(price))
print(pub_count_set) QuerySet [{pub: 清华, myCount: 3, mysum: Decimal(160.50)}, {pub: beida, myCount: 2, mysum: Decimal(788.00)}] for item in pub_count_set:
... print(item[pub],item[myCount],item[mysum])
...
清华 3 160.50
beida 2 788.00
F对象field
一个F对象代表数据库中某条记录的字段的信息
作用: 通常是对数据库中的字段值在不获取的情况下进行操作用于类属性(字段)之间的比较。使用时需要先导入
from django.db.models import F
F(列名) 说明: 一个 F() 对象代表了一个model的字段的值F对象通常是对数据库中的字段值在不加载到内存中的情况下生成sql直接在数据库服务器端进行操作
基本使用
更新Book实例中所有的零售价涨10元 from django.db.models import Ffrom bookstore.models import BookBook.objects.all().update(market_priceF(market_price)10)
生成sqlUPDATE bookstore_book SET market_price (bookstore_book.market_price 10)
5 #作用了5条数据# 以上做法好于如下代码有循环读写慢
books Book.objects.all()
for book in books:book.market_pricebook.marget_price10book.save()使用查询谓词__gt
对数据库中两个字段的值进行比较列出哪儿些书的零售价高于定价?
from django.db.models import F
from bookstore.models import Book
books Book.objects.filter(market_price__gtF(price))
SELECT * FROM bookstore_book WHERE bookstore_book.market_price (bookstore_book.price)
for book in books:print(book.title, 定价:, book.price, 现价:, book.market_price)#go 定价: 88.00 现价: 108.00Q对象query
完整的表达逻辑操作在条件中用来实现除 and() 以外的 or(|) 或 not(~) 操作需要先导入再使用
如: 想找出定价低于20元 或 清华大学出版社的全部书可以写成
from django.db.models import Q
Q(条件1)|Q(条件2) # 条件1成立或条件2成立
Q(条件1)Q(条件2) # 条件1和条件2同时成立
Q(条件1)~Q(条件2) # 条件1成立且条件2不成立
...from django.db.models import Q
# 查找清华大学出版社的书或价格低于50的书
Book.objects.filter(Q(market_price__lt50) | Q(pub清华))
#QuerySet [Book: 书名: java, 出版社: 清华, 定价: 10.50, Book: 书名: python, 出版社: 清华, 定价: 50.00, Book: 书名: c, 出版社: 清华, 定价: 100.00, Book: 书名: xiyou, 出版社: beida, 定价: 700.00]# 查找不是机械工业出版社的书且价格低于50的书
Book.objects.filter(Q(market_price__lt50) ~Q(pub清华))
QuerySet [Book: 书名: xiyou, 出版社: beida, 定价: 700.00]原生的数据库操作方法
模型管理器的raw
在django中可以使用模型管理器的raw方法来执行select语句进行数据查询
MyModel.objects.raw(sql语句[拼接参数]) #防止sql注入返回值: RawQuerySet 集合对象 【只支持基础操作比如循环】
books Book.objects.raw(select * from bookstore_book)
for book in books:print(book)#sql注入攻击问题
s1 Book.objects.raw(select * from bookstore_book where id%s%(1 or 11))
#select * from bookstore_book where id%s%(表单控件获得))
#select * from bookstore_book where id1 or 11; id1没有的时候查询了所有s1
RawQuerySet: select * from bookstore_book where id1 or 11for book in s1:
... print(book)
...
书名: java, 出版社: 清华, 定价: 10.50
书名: python, 出版社: 清华, 定价: 50.00
书名: c, 出版社: 清华, 定价: 100.00
书名: xiyou, 出版社: beida, 定价: 700.00
书名: go, 出版社: beida, 定价: 88.00#防止sql注入拼接参数1 or之间的空格会发生截断后面的不要
s2 Book.objects.raw(select * from bookstore_book where id%s,[1 or 11])for book in s2:
... print(book)
...
书名: java, 出版社: 清华, 定价: 10.50 游标cursor
使用django中的游标cursor直接对数据库进行 增删改查 操作使用前需要先导入
from django.db import connection用创建cursor类的构造函数创建cursor对象再使用cursor对象 为保证在出现异常时能释放cursor资源,通常使用with语句进行创建操作
from django.db import connection
with connection.cursor() as cur:cur.execute(执行SQL语句, 拼接参数)# 用SQL语句将id 为 10的 书的出版社改为 XXX出版社
from django.db import connection
with connection.cursor() as cur: cur.execute(update bookstore_book set pubXXX出版社 where id10;)#拼接参数
with connection.cursor() as cur:cur.execute(update bookstore_book set pubXXX出版社 where id%s,[1 or 12])# 删除 id为1的一条记录
with connection.cursor() as cur: cur.execute(delete from bookstore_book where id10;)