学习视频 地址 https://www.bilibili.com/video/av45473851/?p=7
我先把代码上传了
数据库直接用的默认的想用 MySQL的话看前几张笔记,里面有记录
先看看代码文件
这里面要修改的其实不多
关键位置是
test2/setting.py 整个网站的配置 APP 数据库 静态文件 模板等等都在这里
test2/urls.py 整个网站的路由
而这个文件里的APP 就是我们自己的注册 名字随便起
我这里是叫APP
而这个文件夹里 要修改的只有这四个文件
admin这个文件 就是要在网站后台显示的设置
models 这是最重要的 帮你生成数据库 还有 操作数据库时也是需要它的
urls 这个是路由就不用说了
views 这是就是视图了
下面我们就对之前的代码开始总结了
只说 models和view这两个
东西其实一分析 就发现它很简单 哈哈
比如说model
from django.db import models # Create your models here. # 文章类 class BookInfo(models.Model): # 指定 btitle 对应字段 为title btitle = models.CharField(max_length=20, db_column="title") bpub_date = models.DateField() # 发布时间 bread = models.IntegerField(default=0) # 阅读量 bcomment = models.IntegerField(default=0) # 评论量 isDelete = models.BooleanField(default=False) # 逻辑删除 # 人物类 class PersonInfo(models.Model): pname = models.CharField(max_length=20) # 人物名称 pgender = models.BooleanField(default=False) # 性别 idDelete = models.BooleanField(default=False) # 是否删除 # 人物描述 数据库可为空 但是 操作不能为空 pcomment = models.CharField(max_length=200, null=True, blank=False) hbook = models.ForeignKey('BookInfo', on_delete=models.CASCADE) #生成对应外键 # 生成三个表 # 新闻类型 class TypeInfo(models.Model): tname = models.CharField(max_length=20) # 新闻类别 # 新闻 class NewsInfo(models.Model): ntitle = models.CharField(max_length=60) # 新闻标题 ncontent = models.TextField() # 新闻内容 npub_date = models.DateTimeField(auto_now_add=True) # 新闻发布时间 # 通过ManyToManyField建立TypeInfo类和NewsInfo类之间多对多的关系 # 多生成一张关系表 app_newsinfo_typeinfo typeinfo= models.ManyToManyField('TypeInfo')
第一个 BookInfo 文章类
id 也就是主键不需要你设置 他会帮你默认设置好的,当然你也可以自己设置
两个表关联的id
hbook = models.ForeignKey('BookInfo', on_delete=models.CASCADE) #生成对应外键
就是这一句啦
两个类 多个关系 生成三个表(关系表)
typeinfo= models.ManyToManyField('TypeInfo')
# 人物描述 数据库可为空 但是 操作不能为空 pcomment = models.CharField(max_length=200, null=True, blank=False)
from datetime import date from django.db.models import Q, Sum from django.http import HttpResponse from django.shortcuts import render # Create your views here. from app.models import BookInfo, PersonInfo def index(request): # aa = BookInfo.objects.get(id=40) # print(aa.id,aa.btitle,aa.bpub_date) #全部 集合 #bb = BookInfo.objects.all() #bb = BookInfo.objects.all()[0:2]钱三条 # 全等于 集合 # dd = BookInfo.objects.filter(id__exact='兔') # for cc in dd: # print(cc.id,cc.btitle) # 包含,模糊查询 集合 # dd = BookInfo.objects.filter(btitle__contains='兔') #包含,模糊查询 集合 #以梦结尾,模糊查询 集合 #BookInfo.objects.filter(btitle__endswith='梦') #以红开头的,模糊查询 集合 #BookInfo.objects.filter(btitle__startswith='红') # 查询指定字段不等于空 集合 #BookInfo.objects.filter(btitle__isnull=False) #同一字段 多条件查询 #BookInfo.objects.filter(id__in=[1,2]) # 大于小于 gt、gte、lt、lte:大于、大于等于、小于、小于等于。 # BookInfo.objects.filter(id__gt=3) #大于3 # BookInfo.objects.filter(id__lt=3) #小于3 # 查询日期 # aa = BookInfo.objects.filter(bpub_date__gt=date(1985,1,1)) aa = BookInfo.objects.filter(bpub_date__year=1985) print(aa) return render(request,'app/index.html') # Q对象 def index1(request): #多条件查询 #books = BookInfo.objects.filter(btitle__gt=20,id__lt=10) #并且 # books = BookInfo.objects.filter(Q(btitle__gt=20) & Q(id__lt=10)) # 或 #books = BookInfo.objects.filter(Q(btitle__gt=20) | Q(id__lt=3)) # 不等于 3 pk 主键 books = BookInfo.objects.filter(~Q(id__lt=3)) msg = '' for book in books: msg += str(book.id) + ', ' + book.btitle + ', ' + str(book.bpub_date) + ', ' + str(book.bread) # str += book.btitle msg += '<br>' print(msg) return HttpResponse(msg) # 聚合函数 aggregate() Avg Count Max Min Sum 平均 总数 最大 最小 总和 # 返回的格式 {'id__sum': 21, 'bread__sum': 372} 查询字段__类型 def sum(s): # 查总量 字典 msg = BookInfo.objects.aggregate(Sum("id"),Sum("bread")) # 返回 {'id__sum': 21, 'bread__sum': 372} # 查总数 # msg = BookInfo.objects.count() #返回int类型 print(msg) return HttpResponse(2356) # 其他 def about(s): # exact:表示判等 list = BookInfo.objects.filter(id__exact=1) list = BookInfo.objects.filter(id=1) # contains:是否包含 list = BookInfo.objects.filter(btitle__contains='传') # startswith、endswith:以指定值开头或结尾。 list = BookInfo.objects.filter(btitle__endswith='梦') #以梦结尾 # isnull:是否为null。 list = BookInfo.objects.filter(btitle__isnull=False) # in :是否包含在范围内。 list = BookInfo.objects.filter(id__in=[1, 3, 5]) # gt、gte、lt、lte:大于、大于等于、小于、小于等于。 list = BookInfo.objects.filter(id__gt=3) # 时间 year、month、day、week_day、hour、minute、second list = BookInfo.objects.filter(bpub_date__year=1980) # 1980内 list = BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1)) #大于1990 # 两个属性比较 F对象 def f(s): from django.db.models import F list = BookInfo.objects.filter(bread__gte=F('bcomment')) def index07(s): #查询 西游记 中多有的人物 #多类模型类类名 PersonInfo.objects.filter person = PersonInfo.objects.filter(hbook__btitle__exact='西游记') msg = '' for book in person: msg += book.pname + ', ' + book.pcomment # str += book.btitle msg += '<br>' print(msg) print('--------') # 查询图书 图书人物包含 德 # 使用对象查询 personll = PersonInfo.objects.filter(pcomment__contains='德') for book in personll: msg = book.hbook print(msg.btitle) print('--------') # 使用模型类查询 personll = PersonInfo.objects.get(pname__contains='亮') msg = personll.hbook print(msg.btitle) print('--------') # 一对多 # 查指定书名 对象 book = BookInfo.objects.get(btitle='三国演义') # 一类模型类对象名.小写多类模型类类名_set.查询函数() personals = book.personinfo_set.all() msg = '' for book in personals: msg += book.pname + ', ' + book.pcomment # str += book.btitle msg += '<br>' print(msg) print('--------') # 多对一 person = PersonInfo.objects.get(pname='孙悟空') book = person.hbook print(book.btitle) return HttpResponse(book.btitle) def new(s): try: aa = BookInfo.objects.get(id=40) print(aa) return HttpResponse('有数据') except: return HttpResponse('没有数据')
查一条数据
BookInfo.objects.get(id=40)
查询部数据
BookInfo.objects.all()
查其中的几条
BookInfo.objects.all()[0:2]
不等于的运算符,使用exclude()过滤器。
例:查询编号不等于3的图书
list = BookInfo.objects.exclude(id=3)
order_by 排序
等值查询
exact:表示判等
例:查询编号为1的图书 list=BookInfo.objects.filter(id__exact=1) 可简写为: list=BookInfo.objects.filter(id=1)
模糊查询
contains:是否包含
例:查询书名包含'传'的图书 list = BookInfo.objects.filter(btitle__contains='传')
startswith、endswith:以指定值开头或结尾。
例:查询书名以'梦'结尾的图书 list = BookInfo.objects.filter(btitle__endswith='梦')
空查询
isnull:是否为null。
例:查询书名不为空的图书。list = BookInfo.objects.filter(btitle__isnull=False)
范围查询
in:是否包含在范围内。
例:查询编号为1或3或5的图书 list = BookInfo.objects.filter(id__in=[1, 3, 5])
比较查询
gt、gte、lt、lte:大于、大于等于、小于、小于等于。
例:查询编号大于3的图书 list = BookInfo.objects.filter(id__gt=3)
不等于的运算符,使用exclude()过滤器。
例:查询编号不等于3的图书list = BookInfo.objects.exclude(id=3)
日期查询
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
例:查询1980年发表的图书。 list = BookInfo.objects.filter(bpub_date__year=1980)
例:查询1980年1月1日后发表的图书。 list = BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))
F对象
之前的查询都是属性与常量值比较,如果是两个属性比较,可以通过F对象进行
F对象被定义在django.db.models
中
语法格式:F(属性名)
例:查询阅读量大于等于评论量的图书。 from django.db.models import F list = BookInfo.objects.filter(bread__gte=F('bcomment'))
可以在F对象上使用算数运算。
例:查询阅读量大于2倍评论量的图书 list = BookInfo.objects.filter(bread__gt=F('bcomment') * 2)
Q对象
多个过滤器逐个调用表示逻辑与关系,相当于where子句的AND关键字。
例:查询阅读量大于20,并且编号小于3的图书。 list=BookInfo.objects.filter(bread__gt=20,id__lt=3) 或 list=BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)
如果需要实现逻辑或(OR)查询,需要使用Q()对象结合 | 运算符,
Q对象被义在django.db.models中。
语法格式:Q( 属性名__运算符 = 值 )
例:查询阅读量大于20的图书,改写为Q对象如下。 from django.db.models import Qlist = BookInfo.objects.filter(Q(bread__gt=20))
Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或。
例:查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现 list = BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
Q对象前可以使用~操作符,表示非not。
例:查询编号不等于3的图书。 list = BookInfo.objects.filter(~Q(pk=3))
使用aggregate()
函数调用聚合函数。
聚合函数包括:Avg
,Count
,Max
,Min
,Sum
,被定义在django.db.models
中
aggregate()
返回一个字典类型,格式为{' 属性名小写__聚合函数名小写 ' :值}
,例如:{'bread__sum':3}
例:查询图书的总阅读量。 from django.db.models import Sumdef index(request): s = BookInfo.objects.aggregate(Sum('bread')) print(s['bread__sum']) return render(request, 'app/index.html')
count函数返回一个数字,一般不使用aggregate()过滤器。
例:查询图书总数。 c = BookInfo.objects.count()
返回查询集的过滤器如下:
all():返回所有数据。
filter():返回满足条件的数据。
exclude():返回满足条件之外的数据,相当于sql语句中where部分的not关键字。
order_by():对结果进行排序。
返回单个值的过滤器如下:
get():返回单个满足条件的对象
如果未找到会引发"模型类.DoesNotExist"异常。
如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常。
count():返回当前查询结果的总条数。
aggregate():聚合,返回一个字典。
判断某一个查询集中是否有数据:
exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。
判断某一个查询集中是否有数据:
exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。
限制查询集 (LIMIT子句)
注意:不支持负数索引。
list=BookInfo.objects.all()[0:2]