学习视频 地址 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]