django 基本使用教程
1. 创建工程
django-admin startproject 工程名
2. 创建应用
cd 工程名
mkdir apps
cd apps
python3 ../manage.py startapp 应用名
3. 数据库迁移
3.1 将应用添加到setting.py 的INSTALLED_APPS 中
3.2 生成迁移文件
python3 manage.py makemigrations
3.3 迁移
python3 manage.py migrate
4. 配置静态文件路径
STATIC_URL 访问静态文件的URL前缀
STATICFILES_DIRS 存放查找静态文件的目录
5. 数据库增加
save
from . import models
people = models.PeopleInfo(name="hhh", age=3)
people.save()
create
from . import models
people = models.PeopleInfo.objects.create(name="hhh", age=3)
6. 数据库修改
save
people = PeopleInfo.objects.get(name='hhh')
people.name = "HHH"
people.save()
update
PeopleInfo.objects.filter(name="HHH").update(name="HhH")
7. 数据库删除
模型类对象.delete()
people = PeopleInfo.objects.get(name="HhH")
people.delete()
模型类.objects.filter().delete()
PeopleInfo.objects.filter(name="HHH").delete()
8. 数据库查询
8.1 基本查询
8.1.1 get查询单一结果,如果不存在则会抛出 模型类. DoesNotExist 异常
PeopleInfo.objects.get(name="HHH")
8.1.2 all 查询多个结果
PeopleInfo.objects.all()
8.1.3 count 查询结果数量
PeopleInfo.objecrs.count()
8.2 过滤查询
- filter 过滤出多个结果
- exclude 排除过滤掉符合条件剩下的结果
- get过滤单一结果
- 过滤条件表达语法如下
属性名称__比较运算符=值 # 注意 属性名称 和 比较运算符之间是两个_
相等
exact:表示判等
# 查询PeopleInfo表中id为1的对象
PeopleInfo.objects.filter(id__exact=1) 可以简写 PeopleInfo.objects.filter(id=1)
模糊查询
contains:表示是否包含
# 查询PeopleInfo表中name字段包含H的对象
PeopleInfo.objects.filter(name__contains="H")
空查询
isnull:是否为null
# 查询PeopleInfo表中name不为空的对象
PeopleInfo.objects.filter(name__isnull=True)
范围查询(非连续)
in:是否包含在范围内
# 查询PeopleInfo表中id为1,3,5的对象
PeopleInfo.objects.filter(id__in=[1,3,5])
范围查询(连续)
range:是否包含在范围内
# 查询PeopleInfo表中id为1到5之间的对象
PeopleInfo.objects.filter(id__range=[1,5])
比较查询
- gt:大于
- gte:大于等于
- lt:小于
- lte:小于等于
# 查询id大于3的对象
PeopleInfo.objects.filter(id__gt=3)
返回满足条件以外的数据
- exclude()
# 查询id不等于3的对象
PeopleInfo.objects.exclude(id__exact=3)
日期查询
- pub_date 字段为 models.DateField(verbose_name='发布日期', null=True)
- year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算
# 查询People表中pub_date字段的值为1998的
PeopleInfo.objects.filter(pub_date__year=1998)
# 查询People表中pub_date字段的值大于1998-1-1的
PeopleInfo.objects.filter(pub_date__gt='1998-1-1')
8.3 字段值进行比较
from django.db.models import F
8.3.1 F对象
- 使用方法: F(属性名)
# 查询money字段大于 age乘10
PeopleInfo.objects.filter(money__gt=F("age")*10)
8.4 多条件过滤
8.4.1 Q对象进行多个条件查询
- 使用方法: Q(属性名__运算符=值)
# 查询 age 字段等于1 money大于500
PeopleInfo.objects.filter(Q(age=1),Q(money__gt=500))
PeopleInfo.objects.filter(Q(age=1)&Q(money__gt=500))
# 查询 age 字段等于1 或 money大于500
PeopleInfo.objects.filter(Q(age=1)|Q(money__gt=500))
# 查询 age 字段等于1 money小于等于500
PeopleInfo.objects.filter(Q(age=1), ~Q(money__gt=500))
8.4.2 多个条件查询
# 查询 age 字段等于2 money 字段大于5000
PeopleInfo.objects.filter(age__gt=2, money__gt=3000)
# 查询 age 字段等于2 id字段大于3
PeopleInfo.objects.filter(age__gt=2).filter(id__gt=3)
8.5 关联查询
由一到多
- 使用方法: 一对应的模型类对象.多对应的模型类名小写_set
people = PeopleInfo.objects.get(id=1)
books = peopel.book_set.all()
由多到一
- 使用方法: 多对应的模型类对象.多对应的模型类中的关系类属性名
book = Book.objects.get(id=1)
peoples = book.people
获取由多对一,获取一的属性值
- 使用方法:多对应的模型类对象.关联类属性_id 可以为id 也可以 为其他字段
book = Book.objects.get(id=1)
book.people_id
9. 聚合函数
使用aggregate() 过滤器用来聚合函数
- Avg平均
- Count 数量
- Max 最大
- Min 最小
- Sum 求和
from django.db.models import Sum
# 查询书的总量
BookInfo.objects.aggregate(Sum('readcount'))
10. 排序
- 默认升序
PeopleInfo.objects.all().order_by('id')
- 降序
PeopleInfo.objects.all().order_by('-id')
11. 分页
Paginator类方法
序号 | 方法名 | 说明 |
---|---|---|
1 | page(self, number) | 返回第number页的page类实例对象 |
Paginator类属性
序号 | 属性名 | 说明 |
---|---|---|
1 | num_pages | 返回分页之后的总页数 |
2 | page_range | 返回分页后的页码列表 |
Paginator实例方法
序号 | 方法名 | 说明 |
---|---|---|
has_previous | 判断当前页是否有前一页 | |
has_next | 判断当前页是否有下一页 | |
previous_page_number | 返回前一页的页码 | |
next_page_number | 返回下一页的页码 |
Paginator实例属性
序号 | 属性名 | 说明 |
---|---|---|
1 | number | 返回当前页的页码 |
2 | object_list | 返回当前页的数据查询集 |
3 | paginator | 返回对应的Paginator类对象 |
# 查询数据
books = BookInfo.objects.all()
# 导入分页类
from django.core.paginator import Paginator
# 创建分页实例
paginator = Paginator(books, 2) # 每页有2个数据
# 获取指定页码的数据
page_books = paginator.page(1) # 第1页
# 获取分页数据
total_page=paginator.num_pages