Django下的数据库的增、删、改、查操作。
导入增、删、改、查需要用的模块
from django.db.models import Avg, Max, Min, Count, Sum, Q, F
#导入聚合函数 Q或,非对象 F比较对象(两个属性)
from django import http
from django.views import View
from booktest.models import BookInfo, HeroInfo#这一个模块是测试用数据库表。
from datetime import time #导入格式化日期的模块
1.数据的增加 save(), create()操作
测试地址http://127.0.0.1:800/mysql/
class MysqlView(View):
def get(self, request):
book = BookInfo()
book.btitle = '三国志'
book.bpub_date = '1988-01-01'
book.bread = 10
book.bcomment = 10
book.save()
return http.HttpResponse('测试增删改查')
获得结果:
class MysqlView(View):
def get(self, request):
BookInfo.objects.create(btitle='水浒传', bpub_date='2020-05-25', bread=20, bcomment=30)
return http.HttpResponse('测试增删改查')
获得结果:
2.数据库的删除。物理删除和逻辑删除。delete()
#注意删除内不可以使用save()方法。
class MysqlView(View):
def get(self, request):
#物理删除,永久删除。不推荐!
#get()获取单一属性的值 对象.delete()删除
book = BookInfo.objects.get(id=6)
book.delete()
#类属性删除
BookInfo.objects.filter(id=6).delete()
#逻辑删除推荐
BookInfo.objects.filter(id=6).update(is_delete=True)
return http.HttpResponse('测试增删改查')
3.数据库的修改update()方法
class MysqlView(View):
def get(self, request):
#例子:将id为6的书籍名称改为三国演义
#BookInfo.objects.filter(id=6)
BookInfo.objects.filter(id=6).update(btitle='三国演义')
#也可以用实例属性修改
#book = BookInfo.objects.get(id=6)
#book.btitle='三国演义'
#!注意 save()方法只用在增加或者修改需要保存数据的时候。
#book.save()
return http.HttpResponse('测试增删改查')
获得结果:
数据库的查询操作
1.基本查询
get 查询单一结果,如果不存在会抛出模型类.DoesNotExist异常。
all 查询多个结果。
count 查询结果数量。
class MysqlView(View):
def get(self, request):
#get 查询单一结果,如果不存在会抛出模型类.DoesNotExist异常。
#查询id=5的数据信息
book = BookInfo.objects.get(id=5)
#在之前的models模块中添加了 __str__()方法,所以调用模块之后可以引用返回 return self.btitle的值
print(book)
#all 查询多个结果。
#all()方法会取出所有数据,不可以添加任何条件
book1 = BookInfo.objects.all()
print(book1)
#count 查询结果数量。这里使用的到 gt 比较符后面会用到
#BookInfo.objects.filter(条件).count()
book2 = BookInfo.objects.filter(id__gt=2).count()
print(book2)
return http.HttpResponse('测试增删改查')
2.过滤查询
filter 过滤出多个结果
exclude 排除掉符合条件剩下的结果
get 过滤单一结果
class MysqlView(View):
def get(self, request):
# filter 过滤出多个结果也可以过滤出一个结果多个结果需要用到比较符。
#查询出id=5的数据
book = BookInfo.objects.filter(id=5)
print(book)
#查询出阅读量大于(gt)20的书籍
book1 = BookInfo.objects.filter(id__gt=20)
print(book1)
# exclude 排除掉符合条件剩下的结果(取反)
#取出id不为2的数据
book2 = BookInfo.objects.exclude(id=2)
print(book2)
# get 过滤单一结果
#查询id为2的数据
book3 = BookInfo.objects.get(id=2)
print(book3)
return http.HttpResponse('测试增删改查')
3.模糊查询
contains:是否包含。
startswith、endswith:以指定值开头或结尾。
class MysqlView(View):
def get(self, request):
#contains:是否包含
#查询书籍名称包含'传'的书籍
book = BookInfo.objects.filter(btitle__contains='传')
print(book)
#startswith、endswith:以指定值开头或结尾。
book1 = BookInfo.objects.filter(btitle__startswith='天')
book2 = BookInfo.objects.filter(btitle__endswith='狐')
print(book1, book2)
return http.HttpResponse('测试增删改查')
---获得结果---
<QuerySet [<BookInfo: 射雕英雄传>]>
<QuerySet [<BookInfo: 天龙八部>]> <QuerySet [<BookInfo: 雪山飞狐>]>
3.比较查询
gt 大于 (greater then)
gte 大于等于 (greater then equal)
lt 小于 (less then)
lte 小于等于 (less then equal)
class MysqlView(View):
def get(self, request):
# gt 大于 (greater then)
# gte 大于等于 (greater then equal)
# 查询id大于5的数据信息 查询id大于等于6的信息
book1 = BookInfo.objects.filter(id__gt=5)
book2 = BookInfo.objects.filter(id__gte=6)
# lt 小于 (less then)
# lte 小于等于 (less then equal)
# 查询id小于5的数据信息 查询id小于等于6的信息
book3 = BookInfo.objects.filter(id__lt=5)
book4 = BookInfo.objects.filter(id__lte=6)
print(book1)
print(book2)
print(book3)
print(book4)
return http.HttpResponse('测试增删改查')
---获得结果---
<QuerySet [<BookInfo: 三国演义>, <BookInfo: 三国志>, <BookInfo: 三国志>]>
<QuerySet [<BookInfo: 三国演义>, <BookInfo: 三国志>, <BookInfo: 三国志>]>
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>, <BookInfo: 雪山飞狐>]>
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>, <BookInfo: 雪山飞狐>, <BookInfo: 西游记>, <BookInfo: 三国演义>]>
4.F对象
之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 答:使用F对象,被定义在django.db.models中。
class MysqlView(View):
def get(self, request):
# 例:查询阅读量大于等于评论量的图书。
book = BookInfo.objects.filter(bread__gte=F('bcomment'))
print(book)
#F对象还可以运算符
# 例:查询阅读量大于等于2倍评论量的图书。
book1 = BookInfo.objects.filter(bread__gte=F('comment'))
print(book1)
return http.HttpResponse('测试增删改查')
5.Q对象
多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。
Q对象多用于或(类似于sql语句中的or) 非用~Q表示(类似于sql语句的not)
class MysqlView(View):
def get(self, request):
# 如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符,Q对象被义在django.db.models中。
# 例:查询阅读量大于20的图书,或者编号小于3的书籍。改写为Q对象如下。sql语句内的or关键字在Django内用 Q对象的 | 表示。
book1 = BookInfo.objects.filter(Q(bread__gt=20)|Q(id__lt=3))
#上面语句也可以这么写
#book1 = BookInfo.objects.filter(Q(bread__gt=20)|Q(pk__lt=3))
print(book1)
#Q对象前可以使用~操作符,表示非not。
#查询id不为3的书籍
book2 = BookInfo.objects.filter(~Q(id=3))
print(book2)
return http.HttpResponse('测试增删改查')
5.聚合函数
使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg 平均,Count 数量,Max 最大,Min 最小,Sum 求和,被定义在django.db.models中。
class MysqlView(View):
def get(self, request):
#例:查询图书的总阅读量。
sum = BookInfo.objects.aggregate(Sum('bread))
print(sum)
# get()方法可以取出获得sum 字典内的值
print(sum.get('bread__sum'))
#例:查询图书阅读量最大的书籍。
max = BookInfo.objects.aggregate(Max('bread'))
print(max)
return http.HttpResponse('测试增删改查')
6.排序
使用order_by对结果进行排序
class MysqlView(View):
def get(self, request):
#使用order_by对结果进行排序
#对所有书籍按照阅读量升序 order_by()内填写条件
book1 = BookInfo.objects.all().order_by('bread')
#对所有书籍按照阅读量降序 order_by()内填写条件,在属性前面加上减号 - 即可。
book2 = BookInfo.objects.all().order_by('-bread')
print(book1, book2)
return http.HttpResponse('测试增删改查')
7.关联查询
由一到多的访问语法:
一对应的模型类对象.多对应的模型类名小写_set
class MysqlView(View):
def get(self, request):
#查询书籍id为1所包含的角色数据
book = BookInfo.objects.get(id=1)
h = book.heroinfo_set.all()
print(h)
#查询heroinfo中id为1所在的书籍
hero = HefoInfo.objects.get(id=1)
b = hero.hbook
return http.HttpResponse('测试增删改查')
8.关联过滤查询
由多模型类条件查询一模型类数据
语法如下:
关联模型类名小写__属性名__条件运算符=值
class MysqlView(View):
def get(self, request):
# 查询图书,要求图书英雄为"袁紫衣"
content1 = BookInfo.objects.filter(heroinfo__hname='袁紫衣')
print(content1)
# 查询图书,要求图书中英雄的描述包含"八"
content2 = BookInfo.objects.filter(heroinfo__hcomment__contains='八')
print(content2)
# 查询书名为“天龙八部”的所有英雄。
hero = HeroInfo.objects.filter(hbook__btitle='天龙八部')
print(hero)
# 查询图书阅读量大于30的所有英雄
heros = HeroInfo.objects.filter(hbook__bread__gt=30)
print(heros)
return http.HttpResponse('测试增删改查')
---获得结果---
<QuerySet [<BookInfo: 雪山飞狐>]>
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>]>
<QuerySet [<HeroInfo: 乔峰>, <HeroInfo: 段誉>, <HeroInfo: 虚竹>, <HeroInfo: 王语嫣>]>
<QuerySet [<HeroInfo: 乔峰>, <HeroInfo: 段誉>, <HeroInfo: 虚竹>, <HeroInfo: 王语嫣>, <HeroInfo: 胡斐>, <HeroInfo: 苗若兰>, <HeroInfo: 程灵素>, <HeroInfo: 袁紫衣>]>