一、准备
1.安装MySQL报错解决办法
2.MySQL配置向导
https://jingyan.baidu.com/article/9f7e7ec04407ff6f29155478.html
3.MySQL最新版本下载
https://dev.mysql.com/downloads/mysql/
把C:\Program Files\MySQL\MySQL Server 5.5\bin配置到环境变量path中
4.在C:\Windows\System32下找到cmd.exe,右键以管理员身份运行,输入net start mysql开启服务
5.连接本地MySQL,如果报错的话(也是以管理员身份运行命令行窗口)
命令:mysql -u root -p(回车),然后输入密码
一些常用的操作命令:
show databases;——显示数据库
create database 数据库名 charset=utf8;——创建数据库
use database 数据库名;
show tables;——查看使用的数据库有多少表
6. 今天遇到两个问题:
(1)第一个是我使用的是doc命令插入的表数据,但是命令行窗口默认情况下都是gbk,chcp 936,中文如果在在默认的cmd窗口中显示不出来,显示?才是对的;chcp65001是改为utf-8;
(2)使用Navicat之后记得数据库连接了要关闭,报错截图没有了,反正大佬就是这样跟我说的,不懂。
二、请开始今天的表演
1.创建项目,应用,然后注册应用
2、安装pymysql模块(在命令行窗口中)
命令 pip install pymysql
3.
4.Django配置使用MySQL数据库
提前创建数据库zcq
命令:create database zcq;
5.设计模型类:
软删除标记:删除数据时不做真正的删除,而是把标记位置1表示删除,防止重要的数据丢失。
from django.db import models
# Create your models here.
class BookInfo(models.Model):
# 图书名称
btitle=models.CharField(max_length=20)
# 出版日期
bpub=models.DateField()
# 阅读量
bread=models.IntegerField(default=0)
# 评论量
bcomment=models.IntegerField(default=0)
# 删除标记 false表示不删除,这种标记叫做软删除的标记
isDlete=models.BooleanField(default=False)
class HeroInfo(models.Model):
# 名字
hname=models.CharField(max_length=20)
# 性别
hgender=models.BooleanField(default=False)
# 备注
hcomment=models.CharField(max_length=200)
# 关系属性
hbook=models.ForeignKey("BookInfo",on_delete=models.CASCADE)
# 删除标记 false表示不删除,这种标记叫做软删除的标记
isDlete=models.BooleanField(default=False)
View Code
6、生成迁移文件,迁移生成表
命令:python manage.py makemigrations
python manage.py migrate
不能使用双引号,得使用单引号,不然报错)
insert into booktest_bookinfo(btitle,bpub,bread,bcomment,isDlete) values
('有个人爱你很久很久','2011-10-1',4539,111,0),
('采红','2015-12-1',78905,222,0),
('与你有关的事','2015-12-1',8855,333,0),
('0852','2016-3-25',5550,444,0),
('猎户家的小娘子','2016-2-18',35649,555,0);
insert into booktest_heroinfo(hname,hgender,hbook_id,hcomment,isDlete) values ('乔未若',0,1,'坚强的女主',0),
('林霁远',1,1,'为爱坚持的男主',0),
('周红红',0,2,'乡村爱情,青梅竹马',0),
('程意',1,2,'糙汉子,爱说脏话',0),
('温远',0,3,'爱别扭的小可爱',0),
('温行之',1,3,'运筹帷幄之中,宠小可爱',0),
('卢茵',0,4,'软易推的柔弱妹子',0),
('陆强',1,4,'糙汉子,男友爆发力',0),
('梅子',0,5,'大山里清纯善良小梅子',0),
('萧荆山',1,5,'萧荆山高大健壮沉默寡言',0);
7.视图,重定向
from django.shortcuts import render,redirect
from booktest.models import BookInfo
from datetime import date
from django.http import HttpResponse,HttpResponseRedirect
# Create your views here.
def index(request):
# 1.查询出出所有图书的信息
books=BookInfo.objects.all()
return render(request,"booktest/index.html",{"books":books})
def create(request):
"""新增一本图书"""
# 1.创建BookInfo对象
b=BookInfo()
b.btitle="刺鲸"
b.bpub=date(2016,2,25)
# 2.保存进数据库
b.save()
# 3.返回应答,让浏览器再访问/index首页
# return HttpResponseRedirect("/index")
# 两句话效果是一样的
return redirect("/index")
def delete(request,bid):
# 1.通过bid获取图书对象
book=BookInfo.objects.get(id=bid)
# 2.删除
book.delete()
# 3.重定向,让浏览器还是访问首页/index
# return HttpResponseRedirect("/index")
# 两句话效果是一样的
return redirect("/index")
View Code
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图书信息</title>
</head>
<body>
<a href="/create">新增</a>
<ul>
{% for book in books %}
<li>{{ book.btitle }}--<a href="/delete{{ book.id }}">删除</a></li>
{% endfor %}
</ul>
</body>
</html>
View Code
页面重定向:服务器不返回页面,而是告诉浏览器再去请求其他的url地址。
8.查询
mysql5.5安装之后日志是默认未开启的,可以使用命令查询一下:show variables like 'log_bin';
开启方法:找到my.ini配置文件,用notepad++打开后添加:log-bin=mysql-bin
重启mysql之后(net stop mysql——net start mysql),再次查询:log-bin=mysql-bin
9.模型的字段属性和选项
(1)模型的类属性命名规则:
不能是python的保留关键字;
不允许使用连续的下划线,因为Django的查询方式就是这样决定的;
定义属性需要指定字段类型,通过字段类型的参数指定选项,规则:属性名=models.字段类型(选项)。
(2)一些常用的字段类型(想知道更多请查询官方文档)
【备注:下面两张表格来自大佬】
使用时候需要导入from django.db import models
类型 | 描述 |
AutoField | 自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性。 |
BooleanField | 布尔字段,值为True或False。 |
NullBooleanField | 支持Null、True、False三种值。 |
CharField(max_length=最大长度) | 字符串。参数max_length表示最大字符个数。 |
TextField | 大文本字段,一般超过4000个字符时使用。 |
IntegerField | 整数 |
DecimalField(max_digits=None, decimal_places=None) | 十进制浮点数。参数max_digits表示总位。参数decimal_places表示小数位数。 |
FloatField | 浮点数。参数同上 |
DateField:([auto_now=False, auto_now_add=False]) | 日期。1)参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false。2) 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。3)参数auto_now_add和auto_now是相互排斥的,组合将会发生错误。 |
TimeField | 时间,参数同DateField。 |
DateTimeField | 日期时间,参数同DateField。 |
FileField | 上传文件字段。 |
ImageField | 继承于FileField,对上传的内容进行校验,确保是有效的图片。 |
(3)选项
通过选项实现对字段的约束
选项名 | 描述 |
default | 默认值。设置默认值。 |
primary_key | 若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用。 |
unique | 如果为True, 这个字段在表中必须有唯一值,默认值是False。 |
db_index | 若值为True, 则在表中会为此字段创建索引,默认值是False。 |
db_column | 字段的名称,如果未指定,则使用属性的名称。 |
null | 如果为True,表示允许为空,默认值是False。 |
blank | 如果为True,则该字段允许为空白,默认值是False。 |
对比:null是数据库范畴的概念,blank是后台管理页面表单验证范畴的。
之前有一个问题困扰我,就是改变了模型类中的类属性是不是得重新生成生成迁移文件,迁移表啊,然后下面是来自大佬们的经验:
当修改模型类之后,如果添加的选项不影响表的结构,则不需要重新做迁移,商品的选项中default和blank不影响表结构。
10.查询函数
通过模型类.objects属性可以调用如下函数,实现对模型类对应的数据表的查询。
函数名 | 功能 | 返回值 | 说明 |
get | 返回表中满足条件的一条且只能有一条数据。 | 返回值是一个模型类对象。 | 参数中写查询条件。1) 如果查到多条数据,则抛异常MultipleObjectsReturned。2)查询不到数据,则抛异常:DoesNotExist。 |
all | 返回模型类对应表格中的所有数据。 | 返回值是QuerySet类型 | 查询集 |
filter | 返回满足条件的数据。 | 返回值是QuerySet类型 | 参数写查询条件。 |
exclude | 返回不满足条件的数据。 | 返回值是QuerySet类型 | 参数写查询条件。 |
order_by | 对查询结果进行排序。 | 返回值是QuerySet类型 | 参数中写根据哪些字段进行排序。 |
例子:
get示例:
查询图书id为3 的信息:
BookInfo.objects.get(id=3)
查询图数量评论量为34的图书信息:
BookInfo.objects.get(hcomment=34)
all示例:
查询所有的图书信息:
BookInfo.objects.all()
filter示例:
条件格式:模型类属性 名_条件名=值
模糊查询:
contains——查询书名中包含“0”的图书:
BookInfo.objects.filter(btitle__contains="0")
endswith——查询书名以“久”结尾的图书信息:
BookInfo.objects.filter(btitle__endswith="久")
startswith——查询书名以“久”开头的图书信息:
BookInfo.objects.filter(btitle__startswith="有")
空查询:isnull(True,False)
查询书名不为空的图书:
BookInfo.objects.filter(btitle__isnull=False)
范围查询(in):
查询图书id为1或3或7 的图书:
BookInfo.objects.filter(id__in=[1,3,7])
比较查询:
gt(greate than)——大于
lt(less than)——小于
gte(equal) ——大于等于
lte(equal) —— 小于等于
查询id大于5的图书:
BookInfo.objects.filter(id__gt=5)
日期查询:
查询2016年发表的图书:
BookInfo.objects.filter(bpub__year=2016)
查询2016年5月20日以后发表的图书:
BookInfo.objects.filter(bpub__gt=date(2016,5,20))
exclude:
查询id不为3的图书信息:
BookInfo.objects.exclude(id=3)
order by:对查询结果进行排序
查询所有图书的信息,按照id从小到大进行排序。
BookInfo.objects.all().order_by('id')
查询所有图书的信息,按照id从大到小进行排序。
BookInfo.objects.all().order_by('-id')
把id大于10的图书信息按阅读量从大到小排序显示。
BookInfo.objects.filter(id__gt=10).order_by('-bread')
Q对象
作用:用于查询时条件之间的逻辑关系。not and or,可以对Q对象进行&|~操作。
使用之前需要先导入:
from django.db.models import Q
查询id大于3且阅读量大于30的图书的信息。
BookInfo.objects.filter(id__gt=3, bread__gt=30)
BookInfo.objects.filter(Q(id__gt=3)&Q(bread__gt=30))
查询id大于3或者阅读量大于30的图书的信息。
BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))
查询id不等于3图书的信息。
BookInfo.objects.filter(~Q(id=3))
聚合函数
作用:对查询结果进行聚合操作。
sum count avg max min
aggregate:调用这个函数来使用聚合。返回值是一个字典
使用前需先导入聚合类:
from django.db.models import Sum,Count,Max,Min,Avg
查询所有图书的数目。
BookInfo.objects.all().aggregate(Count('id'))
查询所有图书阅读量的总和。
BookInfo.objects.aggregate(Sum('bread'))
count函数返回值是一个数字
作用:统计满足条件数据的数目。
统计所有图书的数目。
BookInfo.objects.all().count()
BookInfo.objects.count()
统计id大于3的所有图书的数目。
BookInfo.objects.filter(id__gt=3).count()
11.查询集
【摘自别人】
all, filter, exclude, order_by调用这些函数会产生一个查询集,QuerySet类对象可以继续调用上面的所有函数。
查询集特性:
1) 惰性查询:只有在实际使用查询集中的数据的时候才会发生对数据库的真正查询。
2) 缓存:当使用的是同一个查询集时,第一次的时候会发生实际数据库的查询,然后把结果缓存起来,之后再使用这个查询集时,使用的是缓存中的结果。
限制查询集
可以对一个查询集进行取下标或者切片操作来限制查询集的结果;
对一个查询集进行切片操作会产生一个新的查询集,下标不允许为负数;
取出查询集第一条数据的两种方式:
方式 | 说明 |
b[0] | 如果b[0]不存在,会抛出IndexError异常 |
b[0:1].get() | 如果b[0:1].get()不存在,会抛出DoesNotExist异常。 |
exists:判断一个查询集中是否有数据。True False
12模型间关系:
一类,多对应的类叫做多类,把多类中定义的建立关联的类属性叫做关联属性。
一对多:
models.ForeignKey()——定义在多类中
一对一
models.OneToOneField()——定义在哪一个类中都可以
多对多
models.ManyToManyField()——定义在哪一个类中都可以
13.关联查询(一对多)
查询id为1的图书关联的英雄的信息。
b=BookInfo.objects.get(id=1)
b.heroinfo_set.all()
通过模型类查询:
HeroInfo.objects.filter(hbook__id=1)
查询id为1的英雄关联的图书信息。
h = HeroInfo.objects.get(id=1)
h.hbook
通过模型类查询:
BookInfo.objects.filter(heroinfo__id=1)
总结一哈:
(1)由一类的对象查询多类的时候:
一类的对象.多类名小写_set.all()————查询所有的数据
(2)由多类的对象查询一类的时候:
多类的对象.关联属性
比如:由多类的对象查询一类对象的id时候
多类的对象.关联属性_id
[注意]:
(1)通过模型类实现关联查询时,要查哪个表中的数据,就需要通过哪个类来查;
(2)写关联查询条件时,如果类中没有关联属性,条件需要写对应类的名字;如果类中有关系属性,直接写关联属性。
例:查询图书信息,要求图书关联的英雄的描述包含'你'。
BookInfo.objects.filter(heroinfo__hcomment__contains='你')
例:查询图书信息,要求图书中的主角的id大于3.
BookInfo.objects.filter(heroinfo__id__gt=3)
例:查询书名为“0852”的所有人物信息。
HeroInfo.objects.filter(hbook__btitle='0852')
通过多类的条件查询一类的数据:
一类名.objects.filter(多类名小写__多类属性名__条件名)
通过一类的条件查询多类的数据:
多类名.objects.filter(关联属性__一类属性名__条件名)
14.插入,更新和删除:
save方法的时候就可以实现对模型类对应数据表的插入和更新。
delete方法的时候就可以实现对模型类对应数据表数据的删除。
15.自关联
自关联是一种特殊的一对多的关系。
16.管理器
BookInfo.objects.all()
BookInfo.objects.all()->objects是一个什么东西呢?
答:objects是Django帮我自动生成的管理器对象,通过这个管理器可以实现对数据的查询。
objects是models.Manger类的一个对象。自定义管理器之后Django不再帮我们生成默认的objects管理器。
17.元选项
Django默认生成的表名字:
应用名小写_模型类名小写二塔,在里面定义
元选项:
需要在模型类中定义一个元类Meta,在里面定义一个类属性da_table就可以指定表名。