mysql安装
创建数据表
mysql -uroot -p # 登录
show databases;
create database mysheet charset=utf8;
python安装pymysql模块
pip install pymysql
修改settings.py文件
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysheet', # 数据库名称
'HOST': '127.0.0.1',
'PORT': 3306, # 端口号 mysql
'USER': 'root',
'PASSWORD': 'mima',
}
}
修改django项目下__init__.py文件
写入
from pymysql import install_as_MySQLdb
install_as_MySQLdb()
运行时注释掉报错行代码(D:\python37\lib\site-packages\django\db\backends\mysql\base.py 36行)
修改operations.py 第146行
query = query.decode(errors=‘replace’)
为
query = query.encode(errors=‘replace’)
在models.py中定义模型类
from django.db import models
class BookInfo(models.Model):
btitle = models.CharField(max_length=20, verbose_name='名称')
bpub_date = models.DateField(verbose_name='发布日期')
class Meta:
db_table = 'tb_books' # 表名
verbose_name = '图书' # admin后台显示的名称
verbose_name_plural = verbose_name # 显示的复数名称
def __str__(self):
'''定义对象的显示信息'''
return self.btitle
class HeroInfo(models.Model):
hname = models.CharField(max_length=20, verbose_name='名字')
class Meta:
db_table = 'tb_hero' # 表名
verbose_name = '英雄' # admin后台显示的名称
verbose_name_plural = verbose_name # 显示的复数名称
def __str__(self):
'''定义对象的显示信息'''
return self.hname
Mate 可自定义设置表名,若不写Mate 则默认使用 应用小写_小写类名 作为表名
字段类型
字段选项
选项 | 说明 |
---|---|
null | 如果为True,表示允许为空,默认值是False |
blank | 如果为True,则该字段允许为空白,默认值是False |
db_column | 字段的名称,如果未指定,则使用属性的名称 |
db_index | 若值为True,则在表中会为此字段创建索引,默认值是False |
default | 默认 |
primary_key | 若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项 |
unique | 如果为True,这个字段在表中必须有唯一值,默认值是False |
设置外键
hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name="图书")
BookInfo 为其它对象
外键必须设置on_delete参数
CASCADE | 级联,删除主表数据时连同一起删除外键表中数据 |
PROTECT | 保护,通过抛出ProtectedError异常,阻止删除主表中外键使用的数据 |
SET_NULL | 设置为NULL,仅在该字段null=True时使用 |
SET_DEFAULT | 设置为默认值,仅在该字段设置了默认值时可用 |
SET() | 设置为特定值或者调用特定方法 |
数据库迁移
python manage.py makemigrations
项目目录下会生成对应的migrations文件夹执行文件,但是数据还没有写入数据库
python manage.py migrate 执行数据库迁移操作
shell
使用命令
python manage.py shell
用类创建数据
from booktest.models import BookInfo, HeroInfo
from datetime import date
book = BookInfo(btitle="西游记", bpub_date=date(1988,1,1)) #此时在内存中创建数据
book.save() # 写入数据库
hero = HeroInfo(hname="孙悟空")
hero.save()
ORM
增加数据
zbj = HeroInfo.objects.create(hname="猪八戒") # 创建自动会保存
# 增加数据时外键赋值
## 方式1
HeroInfo.objects.create(hname="猪八戒",hbook_id=6)
## 方式2
HeroInfo.objects.create(hname="猪八戒",hbook=book)
# hbook赋值为book对象
删除数据
h = HeroInfo.object.get(id=19)
h.delete()
查询数据
book = BookInfo.objects.all() # 查询book表中所有数据的查询集
book.count() # 统计个数
BookInfo.objects.count()
精准查询 返回数据对象
BookInfo.objects.get(id=3) # 若没有数据或抛出异常 db.models.DoesNotExist
BookInfo.objects.get(id__gt=3,id__lt=5) # 多个条件查询
模糊查询 返回查询集
HeroInfo.objects.filter() # 若没有返回空的查询集
模糊查询
exact | 判等 | HeroInfo.objects.filter(id__exact=1) |
contains | 包含 | HeroInfo.objects.filter(hname__contains="猪") |
startswith | 指定开头 | HeroInfo.objects.filter(hname__startswith="孙") |
endswith | 指定结尾 | HeroInfo.objects.filter(hname__endswith="马") |
isnull | 空查询 | HeroInfo.objects.filter(hname__isnull=False) |
in | 是否在包含范围内 | HeroInfo.objects.filter(id__in=[1,3,5]) |
gt | 大于 | HeroInfo.objects.filter(id__gt=1) |
gte | 大于等于 | HeroInfo.objects.filter(id__gte=2) |
lt | 小于 | HeroInfo.objects.filter(id__lt=5) |
lte | 小于等于 | HeroInfo.objects.filter(id__lte=5) |
获取除指定条件之外的元素
BookInfo.objects.exclude(id__lte=3)
日期查询
year,month,day,week_day,hour,minute,second
# 查询1980年发表的图书
BookInfo.objects.filter(bpub_date__year=1980)
# 查询1980年1月1日后发表的图书
from datetime import date
BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))
F对象
属性值之间的对比
导入F对象
from django.db.models import F
# 查询阅读量大于这条数据评论量的数据
BookInfo.objects.filter(bread__gte=F('bcomment'))
Q对象
实现复杂条件的查询
from django.db.models import Q
# & 与 | 或 ~ 非
BookInfo.objects.filter(~Q(id__gt=10) | Q(id__lt=3))
数据排序
BookInfo.objects.all().order_by('bread')
# 降序排序
BookInfo.objects.all().order_by('-bread')
关联查询
# 方式1
## 一对多的查询,由一个图书对象查询关联的相关多个英雄
b = BookInfo.objects.get(id=1)
b.heroinfo_set.all()
# 默认使用关联模型类小写_set
## 也可在定义hbook字段是自定义设置
hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, related_name='hero') # 自定义related_name参数
b = BookInfo.objects.get(id=1)
b.hero.all()
####################################################
# 方式2
h = HeroInfo.objects.get(id=1)
h.hbook # 获取关联的图书对象
h.hbook_id # 获取关联的图书id
####################################################
# 方式3
## 语法格式: 关联模型类小写__属性名__条件运算符=值
## 条件运算符部分可做省略
## 查询结果为book数据
BookInfo.objects.filter(heroinfo__hname='孙悟空')
# 查询英雄名称孙悟空对应的图书
####################################################
# 方式4
## 语法格式: 外键名称__外键对应模型类属性名__条件运算符=值
## 条件运算符部分可做省略
HeroInfo.objects.filter(hbook__bread__gt=30)
# 查询图书阅读量大于30的所有英雄
聚合函数
使用aggregate() 过滤器调用聚合函数。
聚合函数:
- Avg 平均
- Count 数量
- Max 最大
- Min 最小
- Sum 求和
from django.db.models import Sum
BookInfo.objects.aggregate(Sum('bread')) # 返回 bread列数据求和结果
查询集
使用 all(),filter(),exclude().order_by()方法返回查询集
exists()方法判断查询集是否有数据
限制查询
BookInfo.objects.all()[1:2]
删除数据
# 调用对象的delete
BookInfo.objects.get(id=4).delete()
# 查询集的delete方法
BookInfo.objects.all().delete()
修改数据
方式一:
b = HeroInfo.objects.get(id=3)
b.hname = '孙悟空'
b.save()
方式二:
# 查询集的update方法
HeroInfo.objects.filter(hname__contains='孙').update(hname='孙大圣')
返回json数据
return JsonResponse(alist, safe=False)
自定义管理器
修改models.py文件
from django.db import models
class BookManager(models.Manager):
def all(self):
return super().filter(is_delete=False) # 获取is_delete字段为False的数据
模型类中添加
book = BookManager()
就可使用
BookInfo.book.all()
但是原来的
BookInfo.objects.all()
会失效