1、安装命令
brew install mysql
2、安装后启动mysql
mysql.server start
3、执行安全设置
mysql_secure_installation
4、root密码
password
5、登陆mysql
mysql -uroot -p
6、创建数据库
create database dj charset=utf8;
7、使用数据库
use dj;
8、查看数据表
show tables;
9、建立项目,应用,注册应用
10、改变数据库
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
'ENGINE': 'django.db.backends.mysql',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'NAME': 'dj', # 数据库名称,必须手动创建
'USER': 'root', # 用户名
'PASSWORD': 'password', # 密码
'HOST': 'localhost', # ip地址
'PORT': 3306, # 端口号
}
}
11、安装pymysql
pip install pymysql
12、导入pymysql
import pymysql
pymysql.install_as_MySQLdb()
13、模型类
class BookInfo(models.Model):
'''图书模型类'''
# 图书名
btitle = models.CharField(max_length=20)
# 出版日期
bpub_date = models.DateField()
# 阅读量
bread = models.IntegerField(default=0)
# 评论量
bcomment = models.IntegerField(default=0)
# 删除标记
isDelete = models.BooleanField(default=False)
class HeroInfo(models.Model):
'''英雄模型类'''
# 英雄名
hname = models.CharField(max_length=20)
# 性别
hgender = models.BooleanField(default=False)
# 备注
hcomment = models.CharField(max_length=128)
# 关系属性
hbook = models.ForeignKey('BookInfo',on_delete=models.CASCADE)
# 删除标记
isDelete = models.BooleanField(default=False)
生成迁移文件
python manage.py makemigrations
执行迁移
python manage.py migrate
14、查看数据库
show tables;
desc booktest_bookinfo;
desc booktest_heroinfo;
15、建立测试数据
insert into booktest_bookinfo(btitle,bpub_date,bread,bcomment,isDelete) values
('射雕英雄传','1980-5-1',12,34,0),
('天龙八部','1986-7-24',36,40,0),
('笑傲江湖','1995-12-24',20,80,0),
('雪山飞狐','1987-11-11',58,24,0);
bookinfo
insert into booktest_heroinfo(hname,hgender,hbook_id,hcomment,isDelete) values
('郭靖',1,1,'降龙十八掌',0),
('黄蓉',0,1,'打狗棍法',0),
('黄药师',1,1,'弹指神通',0),
('欧阳锋',1,1,'蛤蟆功',0),
('梅超风',0,1,'九阴白骨爪',0),
('乔峰',1,2,'降龙十八掌',0),
('段誉',1,2,'六脉神剑',0),
('虚竹',1,2,'天山六阳掌',0),
('王语嫣',0,2,'神仙姐姐',0),
('令狐冲',1,3,'独孤九剑',0),
('任盈盈',0,3,'弹琴',0),
('岳不群',1,3,'华山剑法',0),
('东方不败',0,3,'葵花宝典',0),
('胡斐',1,4,'胡家刀法',0),
('苗若兰',0,4,'黄衣',0),
('程灵素',0,4,'医术',0),
('袁紫衣',0,4,'六合拳',0);
heroinfo
16、视图函数
from django.shortcuts import render,redirect
from .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()
# 2、使用模版
return render(request,'booktest/index.html',
{'books':books})
def create(request):
'''新增一本书'''
# 1、创建BookInfo对象
b = BookInfo()
b.btitle = '流星蝴蝶剑'
b.bpub_date = date(2020,1,20)
# 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')
17、urls配置
主路由
from django.contrib import admin
from django.urls import path
from django.conf.urls import url,include
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^',include('booktest.urls'))
]
子路由
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^index/$',views.index),
url(r'^create/$',views.create),
url(r'^delete(\d+)$',views.delete),
]
18、模版重定向
# settings.py
'DIRS': [os.path.join(BASE_DIR,'templates')],
<!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>
19、以上部分效果图
result
20、查询
1、判等
BookInfo.objects.get(id=1)
2、模糊查询
a)存在 传 的书名
BookInfo.objects.filter(btitle__contains='传')
b)以 部结尾的书名
BookInfo.objects.filter(btitle__endswith='部')
3、查询书名不为空
select * from booktest_bookinfo where btitle is not null;
BookInfo.objects.filter(btitle__isnull=False)
4、范围查询 in
查询id 为 1,3,5
select * from booktest_bookinfo where id in (1,3,5);
BookInfo.objects.filter(id__in=[1,3,5])
5、比较查询 gt lt gte lte
查询编号大于3的图书
select * from booktest_bookinfo where id > 3;
BookInfo.objects.filter(id_gt=3)
6、日期查询
a)查询1980年发表的图书
BookInfo.objects.filter(bpub_date__year=1980)
b)查询1980年1月1日后发表的图书
from datetime import date
BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))
7、不满足条件查询 exclude
BookInfo.objects.exclude(id=3)
8、排序
a)查询所有图书信息,按照id从小到大进行排序
BookInfo.objects.all().order_by('id')
b)查询所有图书信息,按照id从大到小进行排序
BookInfo.objects.all().order_by('-id')
c)把id大于3的图书信息按照阅读量从小到大排序显示
BookInfo.objects.filter(id__gt=3).order_by('-bread')
9、Q对象
作用:用于查询时条件之间的逻辑关系。not and or
使用之前需要先导入:
from django.db.models import Q
a)查询id大于3且阅读量大于30的图书信息
BookInfo.objects.filter(id__gt=3,bread__gt=30)
BookInfo.objects.filter(Q(id__gt=3)&Q(bread__gt=30))
b)查询id大于3或者阅读量大于30的图书信息
BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))
c)查询id不等于3的图书信息
BookInfo.objects.filter(~Q(id=3))
10、F对象
作用:用于类属性之间的比较
使用之前需要导入:
from django.db.models import F
a)查询图书阅读量大于评论量的图书信息
BookInfo.objects.filter(bread__gt=F('bcomment'))
b)查询图书阅读量大于2倍评论量图书信息
BookInfo.objects.filter(bread__gt=F('bcomment')*2)
11、聚合函数
作用:对查询结果进行聚合操作
sum count avg max min
aggregate: 调用这个函数使用聚合,返回是一个字典
使用之前需先导入:
from django.db.model import Sum,Count,Max,Min,Avg
a)查询所有图书数目
BookInfo.objects.all().aggregate(Count('id'))
{'id_count':3}
b)查询所有图书阅读量的总和
BookInfo.objects.aggregate(Sum('bread'))
c)统计所有图书的数目
BookInfo.objects.count()
返回是数字
d)统计id大于3的所有图书数目
BookInfo.objects.filter(id__gt=3).count()
12、查询集
1)惰性查询,只有真正发生查询时才会查询
2)缓存,当使用的是同一个查询集时,第一次查询会发生数据库查询,之后再使用这个查询集时,使用的是缓存的结果
限制查询集:可以进行切片操作,下标不能为负数
exists:判断一个查询集是否有数据
网友评论