Django操作数据库表增、删、改、查(2020/8/12)

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: 袁紫衣>]>
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值