问题
1.创建应用(进入bookmanager02工程名)
python manager.py startapp book
报错:can’t open file ‘manager.py’: [Errno 2] No such file or directory
改用:django-admin startapp book
创建MySQL数据库
1、创建数据库
cmd
mysql -uroot -proot
create database book charset utf8;
use book;
2、运行异常
解决:pip install mysqlclient(虚拟环境下)
模型
from django.db import models
# Create your models here.
"""
https://docs.djangoproject.com/en/3.1/
1. 模型类 需要继承自 models.Model
2. 定义属性
id 系统默认会生成
属性名=models.类型(选项)
2.1 属性名 对应 就是字段名
不要使用 python,MySQL关键字
不要使用连续的下划线(__)
2.2 类型 MySQL的类型
2.3 选项 是否有默认值,是否唯一,是否为null
CharField 必须设置 max_length
verbose_name 主要是 admin站点使用
3. 改变表的名称
默认表的名称是: 子应用名_类名 都是小写
修改表的名字
create table `qq_user` (
id int ,
name varchar(10) not null default ''
)
"""
class BookInfo(models.Model):
# date 日期
# data 数据
name=models.CharField(max_length=10,unique=True)
pub_date=models.DateField(null=True)
readcount=models.IntegerField(default=0)
commentcount=models.IntegerField(default=0)
is_delete=models.BooleanField(default=False)
# 1对多的关系模型中
# 系统会为我们自动添加一个 关联模型类名小写_set
#
#peopleinfo_set=[PeopleInfo,PeopleInfo,...]
#peopleinfo
def __str__(self):
return self.name
class Meta:
db_table='bookinfo' # 修改表的名字
verbose_name='书籍管理' #admin站点使用的(了解)
数据迁移(进入bookmanager02)
python manage.py makemigrations
python manage.py migrate
django.db.migrations.exceptions.MigrationSchemaMissing: Unable to create the django_migrations table ((1064, "You have an error in your SQL syntax;
解决:
Django2.1不再支持MySQL5.5,必须5.6版本以上。。。
卸载重装吧!!!
外键
初始化数据
insert into bookinfo(name, pub_date, readcount, commentcount, is_delete) values
('射雕英雄传', '1980-12-1',12,34,0),
('天龙八部', '1986-7-24',36,40,0),
('笑傲江湖', '1996-4-6',20,80,0),
('雪山飞狐', '1987-11-8',58,24,0)
insert into peopleinfo(name, gender, book_id, description, is_delete) values
('郭靖', 1,1,'降龙十八掌',0),
('黄蓉', 0,1,'打狗棒',0),
('黄药师', 1,1,'弹指神通',0),
('欧阳锋', 1,1,'蛤蟆功',0),
('乔峰', 1,2,'降龙十八掌',0),
('段誉', 1,2,'凌波微步',0),
('令狐冲', 1,3,'独孤九剑',0),
('岳不群', 1,3,'葵花宝典',0),
('胡一刀', 1,4,'胡家刀法',0)
Shell的作用
控台执行
python manage.py shell
>>> from book.models import BookInfo
>>> BookInfo.objects.all()
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>, <BookInfo: 雪山飞狐>]>
>>>
查看数据库日志
68 69 # 去除,重启
查看日志
mysql.log
数据增删改查
def index(request):
book = BookInfo.objects.all()
print(book)
return HttpResponse('index')
# ###########################################
from book.models import BookInfo
# 方式1
book=BookInfo(
name='Django',
pub_date='2000-1-1',
readcount=10
)
# 必须要调用 对象的save方法才能将数据保存到数据库中
book.save()
#方式2
# objects -- 相当于一个代理 实现增删改查
#
BookInfo.objects.create(
name='测试开发入门',
pub_date='2020-1-1',
readcount=100
)
########################修改数据################################
# 方式1
# select * from bookinfo where id=6
book=BookInfo.objects.get(id=6)
book.name='运维开发入门'
# 想要保存数据 需要调用 对象的save方法
book.save()
# 方式2
# filter 过滤
BookInfo.objects.filter(id=6).update(name='爬虫入门',commentcount=666)
# 错误的
# BookInfo.objects.get(id=5).update(name='5555',commentcount=999)
#####################删除数据#####################
# 方式1
book=BookInfo.objects.get(id=6)
# 删除分2中, 物理删除(这条记录的数据 删除) 和 逻辑删除(修改标记位 例如 is_delete=False)
book.delete()
# 方式2
BookInfo.objects.get(id=6).delete()
BookInfo.objects.filter(id=5).delete()
查询操作
基础查询
# 查询书名包含'湖'的图书
BookInfo.objects.filter(name__contains='湖')
# 查询书名以'部'结尾的图书
BookInfo.objects.filter(name__endswith='部')
# 查询书名为空的图书
BookInfo.objects.filter(name__isnull=True)
# 查询编号为1或3或5的图书
BookInfo.objects.filter(id__in=[1,3,5])
# 查询编号大于3的图
# 大于 gt great 大
# 大于等于 gte e equal
#
# 小于 lt litte
# 小于等于 lte
BookInfo.objects.filter(id__gt=3)
# 查询编号不等于3的书籍
BookInfo.objects.exclude(id=3)
# 查询1980年发表的图书
BookInfo.objects.filter(pub_date__year=1980)
# 查询1990年1月1日后发表的图书
BookInfo.objects.filter(pub_date__gt='1990-1-1')
# 错误的
# BookInfo.objects.filter(pub_date__gt='199011')
F和Q对象
两属性比较F
#################################################
from django.db.models import F
# 使用: 2个属性的比较
#语法形式: 以filter 为例 模型类名.objects.filter(属性名__运算符=F('第二个属性名'))
# 查询阅读量大于等于评论量的图书
BookInfo.objects.filter(readcount__gte=F('commentcount'))
#####################################
# 并且查询
# 查询阅读量大于20,并且编号小于3的图书。
BookInfo.objects.filter(readcount__gt=20).filter(id__lt=3)
#或者
BookInfo.objects.filter(readcount__gt=20,id__lt=3)
查询阅读量大于20,或者编号小于3的图书
from django.db.models import Q
# 或者语法: 模型类名.objects.filter(Q(属性名__运算符=值)|Q(属性名__运算符=值)|...)
# 并且语法: 模型类名.objects.filter(Q(属性名__运算符=值)&Q(属性名__运算符=值)&...)
# not 非 语法: 模型类名.objects.filter(~Q(属性名__运算符=值))
#
BookInfo.objects.filter(Q(readcount__gt=20)|Q(id__lt=3))
# 查询编号不等于3的书籍
BookInfo.objects.exclude(id=3)
BookInfo.objects.filter(~Q(id=3))
聚合函数与排序函数
聚合函数aggregate
from django.db.models import Sum,Max,Min,Avg,Count
# 模型类名.objects.aggregate(Xxx('字段名')
BookInfo.objects.aggregate(Sum('readcount'))
排序
BookInfo.objects.all().order_by('readcount')
多表级联查询
# 查询书籍为1的所有人物信息
# 获取了id为1的书籍
book=BookInfo.objects.get(id=1)
book.peopleinfo_set.all()
# PeopleInfo.objects.filter(book=1)
# 查询人物为1的书籍信息
person=PeopleInfo.objects.get(id=1)
person.book.name
person.book.readcount
关联过滤查询
# 语法形式
# 查询1的数据, 条件为 n
# 模型类名.objects.(关联模型类名小写__字段名__运算符=值)
# 查询图书,要求图书人物为"郭靖"
BookInfo.objects.filter(peopleinfo__name__exact='郭靖')
BookInfo.objects.filter(peopleinfo__name='郭靖')
# 查询图书,要求图书中人物的描述包含"八"
BookInfo.objects.filter(peopleinfo__description__contains='八')
# 查询书名为“天龙八部”的所有人物
PeopleInfo.objects.filter(book__name='天龙八部')
PeopleInfo.objects.filter(book__name__exact='天龙八部')
# 查询图书阅读量大于30的所有人物
PeopleInfo.objects.filter(book__readcount__gt=30)
查询集QuerySet
1、两大特性:惰性查询
books = BookInfo.objects.all()
#迭代操作,才真正执行
for book in books
Print(book)
2、缓存
from book.model import BookInfo
[book.id for book in BookInfo.objects.all()]
3、限制查询集合-切片
books = BookInfo.objects.all()[0:2]
books
4、分页
查询数据
Books = BookInfo.objects.all()
导入分页类
from django.core.paginator import Paginator
创建分页实例
paginator = Paginator(books, 2)
获取指定页码数据
page_book = paginator.page(1)
#获取分页数据
total_pages = paginator.num_pages