创建项目
# 创建项目
django-admin startproject [projectName]
# 创建模块
python manage.py startapp [moduleName]
对于Mysql数据库:需要安装pymysql这个第三方库
安装命令:pip3 install mysqlclient
数据库配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'blog',
'USER': 'root',
'PASSWORD': 'root',
'HOST': '172.0.0.1',
'PORT': 3306
}
}
模型
5.2 数据查询
要从数据库检索数据, 首先要获取一个查询集(Query Set) , 查询集表示从数据库获取的对象集合,它可以有零个,一个或多个过滤器。返回查询集的方法,称为过滤器, 过滤器根据给定的参数缩小查询结果范围, 相当于sql语句中where或limit。
- 在管理器上调用过滤器方法会返回查询集
- 查询集经过过滤器筛选后返回新的查询集,因此可以写成链式过滤
- 惰性执行; 创建查询集不会带来任何数据库的访问,直到调用数据时,才会访 问数据库 。
- 以下对查询集求值:迭代、切片、序列化、与if合用
repr() /print(/len() /list() /boo()
管理器的方法 | 返回类型 | 说明 |
---|---|---|
模型类.objects.all() | Query Set | 返回表中所有数据 |
模型类.objects.filter() | Query Set | 返回符合条件的数据 |
模型类.objects.exclude() | Query Set | 返回不符合条件的数据 |
模型类.objects.order_by() | Query Set | 对查询结果集进行排序 |
模型类.objects.values() | Query Set | 返回一个Query set, 其中每个对象为一个 |
模型类.objects.values_list() | Query Set | 和values() 基本相同, 但每个对象是一个元 |
模型类.objects.reverse() | Query Set | 对排序的结果反转 |
模型类.objects.only(字段) | Query Set | 只显示指定字段 |
类.objects.defer(字段) | Query Set | 去除指定字段 |
模型类.objects.get() | 模型对象 | + 返回一个满足条件的对象; 如果没有找到符合条件的对象,会引发模型类.Does Not Exist异常 + 如果找到多个,会引发模型 类.Multi Objects Returned异常 |
模型类.objects.first() | 模型对象 | 返回第一条数据 |
模型类.objects.last() | 模型对象 | 返回最后一条数据 |
模型类.objects.earliest () | 模型对象 | 根据指定字段返回最早增加的记录 |
模型类.objects.latest(field) | 模型对象 | 根据field字段返回最近增加记录 |
模型类.objects.exists() | bool | 判断查询的数据是否存在 |
模型类.objects.count() | int | 返回查询集中对象的数目 |
- all()
# 获取所有数据
对应SQL:select * from User
users= User.objects.all()
- filter(**kwargs) 返回QuerySet包含与给定查找参数匹配的新查询集。
等价于:select * from User
User.objects.filter()
对应SQL:select * from User where username='admin'
User.objects.filter(username='admin')
对应SQL:select * from User where id >1 and type=2
User.objects.fileter(id__gt=1, type=2)
对应SQL:select * from User where id >1 and type = 2
User.objects.filter(id_gt=1).filter(type=2)
- exclude(**kwargs)
对应SQL:select * from User where username != 2
User.objects.exclude(username='admin')
- order_by(*fields)
参数是字段名、可以有多个字段名,默认是升序
如果要按某个字段降序。在字段名前面加"-": "id"表示按id降序排列
按照id升序排列 对应SQL:select * from User order by id
User.objects.order_by('id')
按照id降序排列 对应SQL:select * from User order by id desc
User.objects.order_by('-id')
按照username升序排列 按照id降序排列 对应SQL: select *from User order by username, id desc
User.objects.order_by('username', '-id')
- values()
返回所有字段 对应SQL: select * from User
User.objects.values()
返回所有数据的username 和 password 字段 对应SQL: select username, password from User
User.objects.values('username', 'password')
- reverse()
对排序的结果反转
对应SQL: select * from User order by id desc
User.objects.order_by('id').reverse()
对应SQL: select * from User order by id
User.objects.order_by('-id').reverse()
- distinct() 去重
对应SQL: select DISTINCT username from User
User.objects.values('username').distinct()
5.2.5统计查询
需要先导入模块:
from django.db.models import Max, Min, Sum, Avg, Count
- 聚合查询:对多行查询结果的一列进行操作
#统计记录总数: select count(*) from user
User.objects.aggregate(Count('uid') ) #{'uid_count':4}
User.objects.aggregate(Max('uid') ) #{'uid max':5}
User.objects.aggregate(Min('uid') ) #{'uid min':2}
- 分组统计
# 等价sql:
select type, count(*) from usergroup by type
res=User.objects.values('type') .annotate(Count('uid') )
# 统计结果:
[{"type": :' 普通用户', 'uid count':3} ,{'type':'超级管理员', 'uid count':1} ]
# 查看生成的sql语句
print(res.query)
# 此语法忘了没搞明白
SELECT`user`.`type`, COUNT(`user`.uid`) )AS ; `uid d count t` FROM `user` GROUP BY `user`.`type`ORDER BY NULL
5.2.6 Q对象和F对象
需要先导入模块:
from django.db.models import Q,F
- Q对象可以对关键字参数进行封装, 从而更好的应用多个查询, 可以组合&(and) 、I(or) 、~(not) 操作符。
#原生sql:
select * from user where uid=2 or uid= 3
User.objects.filter(Q(uid=2) | Q(uid=3) )
User.objects.filter(Q(uid gte=2) &Q(uidl te=3) )
User.objects.filter(~Q(uid gte=2) )
- F对象:用于比较表中两个字段
#等价sql:
select * from user where uid<type
User.objects.filter(uidl te=F('type') )
网友评论