1.创建数据库
mysql -uroot -pmysql
create database django_demo charset=utf8;
2.配置mysql数据库
在settings.py 中配置数据库连接信息
# 默认数据库信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
修改为:
# 以自己创建的数据库为准
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1', # 数据库主机
'PORT': 3306, # 数据库端口
'USER': 'root', # 数据库用户名
'PASSWORD': 'mysql', # 数据库用户密码
'NAME': 'djangodb' # 数据库名字
}
}
修改成功后 ,需要安装MySQL数据库的客户端驱动
安装mysqlclient
pip install mysqlclient
3.ORM框架介绍
O是object,也就是类或者对象的意思,这里的类就是模型类
R是relation,也就是关系数据库中数据表的意思
M是mapping,也就是映射的意思
在ORM框架中,它帮我们把模型类和数据表进行了一个映射,可以让我们通过模型类及对象就能操作它所对应的数据表中的数据
ORM框架它还可以根据我们设计的模型类自动帮我们生成数据库中对应的数据表,省去了我们自己建表的过程
作用和优点:
1.只需要 面向对象编程 , 不需要面向数据库编写代码
2.实现了数据模型与数据库的 解耦 , 屏蔽了不同数据库操作上的差异.
4.定义模型了和数据库迁移
模型类被定义在子应用/models.py文件中
模型类必须继承自Model类,位于django.db.models中
创建子应用booktest,并在其models.py文件中定义模型类
class BookInfo(models.Model):
# 创建字段,字段类型...
btitle = models.CharField(max_length=20, verbose_name='名称')
bpub_date = models.DateField(verbose_name='发布日期', null=True)
bread = models.IntegerField(default=0, verbose_name='阅读量')
bcomment = models.IntegerField(default=0, verbose_name='评论量')
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
class Meta:
db_table = 'bookinfo' # 指明数据库表名
verbose_name = '书' # 在admin站点中显示的名称
def __str__(self):
"""定义每个数据对象的显示信息"""
return self.btitle
class HeroInfo(models.Model):
GENDER_CHOISE = (
(0, 'male'),
(1, 'female')
)
hname = models.CharField(max_length=20, verbose_name="名字")
hgender = models.SmallIntegerField(choices=GENDER_CHOISE, verbose_name="性别")
hdesc = models.CharField(max_length=200, null=True, verbose_name="介绍")
hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name="评论量")
is_delete = models.BooleanField(default=False, verbose_name="逻辑删除")
class Meta:
db_table = 'heroinfo'
verbose_name = '英雄'
def __str__(self):
return self.hname
了解:关于外键
在设置外键时,需要通过on_delete选项指明主表删除数据时,对于外键引用表数据如何处理,在django.db.models中包含了可选常量:
CASCADE 级联,删除主表数据时连通一起删除外键表中数据
PROTECT 保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据
SET_NULL 设置为NULL,仅在该字段null=True允许为null时可用
SET_DEFAULT 设置为默认值,仅在该字段设置了默认值时可用
SET() 设置为特定值或者调用特定方法
DO_NOTHING 不做任何操作,如果数据库前置指明级联性,此选项会抛出IntegrityError异常
5.迁移模型类
# 生成迁移文件
python manage.py makemigrations
#同步到数据库中
python manage.py migrate
插入数据测试
insert into bookinfo(btitle,bpub_date,bread,bcomment,is_delete) 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);
insert into heroinfo(hname, hgender, hbook_id, hdesc, is_delete) 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);
6.增删改查
ps:交互测试代码可以在这
6.1 新增
增加数据有两种方式1.save()
2.create()
使用前要进行导包
from book_test.models import BookInfo,HeroInfo
方式一:save
book =BookInfo()
book.btitle ='西游记'
book.bpub_date='2020-02-02'
book.bread=20
book.bcomment=30
book.save()
方式二:create
BookInfo.object.create(
btitle='三国',
bpub_date='2020-01-01',
bread=100,
bcomment=200
)
6.2 修改
修改数据有两种方式1.save()
2.update
from book_test.models import BookInfo,HeroInfo
方式一:save
#把叫猪八戒的英雄改为猪悟能
hero =HeroInfo.objects.get(hname='猪八戒')
hero.hname='猪悟能'
hero.save()
方式二:update
#把叫沙悟净的英雄改为沙僧
HerInfo.objects.filter(hname='沙悟净').update(hname='沙僧')
6.3删除
删除数据有两种方式1.模型类对象delete
2.模型类.objects.filter().delete()
方式一:
#删除id为1的英雄
hero=HeroInfo.objects.get(id=1)
hero.delete()
方式二:
#删除id为2的英雄
HeroInfo.objects.filter(id=2).delete()
6.4 查询
1.基本查询2.过滤查询
3.模糊查询
4.空查询
5.范围查询
6.比较查询
7.日期查询
基本查询:
get 查询单一结果,如果不存在会抛出DoesNotExist异常,如果存在多个结果会报MultipleObjectsReturned异常
all 查询多个结果。
count 查询结果数量
# 查询所有书
BookInfo.objects.all()
#查询id为1的书
BookInfo.objects.get(id=3)
#查询书的总数
BookInfo.objects.count()
过滤查询:
filter 过滤出满足条件的多个结果
exclude 排除掉符合条件剩下的结果( 取反 )
语法:
属性名称__比较运算符=值
# 查询编号为1的图书
BookInfo.objects.filter(id=1)
#查询除了编号为1之外的图书
BookInfo.objects.exclude(id=1)
模糊查询:
contains:是否包含
startswith、endswith:以指定值开头或结尾
# 查询书名包含'传'的图书
BookInfo.objects.filter(btitle__contains='传')
#查询书名以'部'结尾的图书
BookInfo.objects.filter(btitle__endswith='部')
以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith.
空查询:
isnull:是否为null
#查询书名不为空的图书
BookInfo.object.filter(btitle__isnull=False)
范围查询:
in:是否包含在范围内
#查询编号为1或3或5的图书
BookInfo.object.filter(id__in=[1,3,5])
比较查询:
gt 大于
gte 大于等于
lt 小于
lte 小于等于
#查询编号大于3的图书
BookInfo.objects.filter(id__gt=3)
日期查询:
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
# 查询1980年发表的图书
BookInfo.objects.filter(bpub_date__year=1980)
#查询1980年1月1日后发表的图书。
BookInfo.objects.filter(bpub_date__gt=date(1990,1,1))
7.F和Q对象使用
F对象F对象 两个属性进行比较
F(属性名)
使用时需要进行导包
from django.db.models import F,Q
#查询阅读量大于等于评论量的图书
BookInfo.objects.filter(bread__gte=F('bcomment'))
#查询阅读量大于2倍评论量的图书
BookInfo.objects.filter(bread_gt=F('bcomment')*2)
Q对象
Q对象 多个过滤器逐个调用表示逻辑与关系
实现 not and or
not ~
and &
or |
Q(属性名__运算符=值)
#查询阅读量大于20,并且编号小于3的图书
BookInfo.objects.filter(bread__gt=20,id__lt=3)
或
BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)
使用时需要进行导包
from django.db.models import F,Q
#查询阅读量大于20,或编号小于3的图书
BookInfo.object.filter(Q(bread_gt=20) | Q(id__it=3))
Q对象前可以使用~操作符,表示非not。
#查询编号不等于3的图书
BookInfo.object.filter(~Q(id=3))