查询数据
# 查询数据
def get_person(request):
# get()方法:获取单条数据
p = PersonModel.objects.get(id=2)
print("*" * 50)
print(p, type(p)) #PersonModel对象
print(p.name, p.age)
print("*" * 50)
return HttpResponse("查询成功")
看一下打印结果 得到的是一个类的对象
**************************************************
PersonModel object (2) <class 'App.models.PersonModel'>
李四 666
**************************************************
下面是一些相应的写法
# get()方法:获取单条数据
# 如果没有找到符合条件的对象,会引发模型类.DoesNotExist异常
# 如果找到多个,会引发模型类.Multiple0bjectsReturned 异常
p = PersonModel.objects.get(id=2)
# p = PersonModel.objects.get(2) # 不可以写成这样会报错
p = PersonModel.objects.get(pk=2) # pk=primary key 主键
p = PersonModel.objects.get(age=666) # 可以
# p = PersonModel.objects.get(age=100) # 不可以 多条数据会报错
# p = PersonModel.objects.get(age=1001) # 不可以 没有数据也会报错
all()的写法
# all()方法:获取所有数据
persons = PersonModel.objects.all()
print(persons, type(persons))
# <QuerySet> 查询集
# 可以遍历查询集
for person in persons:
print(person.name, person.age)
first()
# first()方法:获取第一条数据
p = PersonModel.objects.first()
print(p.name, p.age)
last()
# last()方法:获取最后一条数据
p = PersonModel.objects.last()
print(p.name, p.age)
filter()方法
# filter()方法:获取符合条件的数据 使用最多
persons = PersonModel.objects.filter() # 默认没有条件 获取所有数据
persons = PersonModel.objects.filter(age__gt=50) # age>50
persons = PersonModel.objects.filter(age__gte=50) # age >= 50
persons = PersonModel.objects.filter(age__lt=50) # age < 50
persons = PersonModel.objects.filter(age__lte=50) # age <= 50
persons = PersonModel.objects.filter(age=50) # age = 50
# 查询集可以做链式查询
# print(persons.filter().filter().all())
for p in persons:
print("-----", p.name, p.age)
print(persons.first())
print(persons.last())
print(persons.exists()) # 查询集是否存在数据如果存在True 没有就显示False
print(persons.count()) # 统计数量
# values()和values_list()方法:获取指定字段的数据
persons = PersonModel.objects.filter()
# values():列表套字典,包括字典和值
print("persons:", persons)
print("list(persons):", list(persons)) # 将查询集强制转换成列表
print("persons.values():", persons.values()) # 列表转字典
print("persons.values('name')", persons.values("name")) # 可以指定字段
# values_list():列表套元组,只有值
print("persons.values_list():", persons.values_list()) # 列表转元组
print("persons.values_list('name')", persons.values_list("name")) # 可以指定字段
filter():详细 类似于数据库的where条件
persons = PersonModel.objects.filter(age__in=[50, 666]) # age in (50, 666)
# exclude()方法:排除符合条件的数据 可以理解成取反
persons = PersonModel.objects.exclude(age__in=[50, 100]) # not in (50, 100)
persons = PersonModel.objects.filter(age__contains='6') #包含 类似于模糊查找 类似于like
persons = PersonModel.objects.filter(name__icontains="张") # 忽略大小写的包含
persons = PersonModel.objects.filter(name__regex="张.*") # 正则查找
persons = PersonModel.objects.filter(name__iregex="张.*") # 正则查找 忽略大小写
persons = PersonModel.objects.filter(age__range=[100,200]) # 范围查找
persons = PersonModel.objects.filter(name__endwith="峰") # 以什么结尾
persons = PersonModel.objects.filter(name__iendwith="峰") # 以什么结尾 忽略大小写
persons = PersonModel.objects.filter(name__startswith="张") # 以什么开始
persons = PersonModel.objects.filter(name__istartswith="张") # 以什么开始 忽略大小写
聚合函数 在使用的之前需要先导入包
from django.db.models import Max, Min, Avg, Count, Sum
result = PersonModel.objects.aggregate(Max("age")) # 最大值
result = PersonModel.objects.aggregate(Min("age")) # 最小值
result = PersonModel.objects.aggregate(Sum("age")) # 求和
result = PersonModel.objects.aggregate(Avg("age")) # 平均值
result = PersonModel.objects.aggregate(Count("age")) # 计数
排序
# 排序
result =PersonModel.objects.all().order_by("age") # 升序
result = PersonModel.objects.all().order_by("age", "id") # 升序 多字段排序
result =PersonModel.objects.all().order_by("-age") # 降序
分页功能
# 分页功能
def paginte(request, page=1):
# 页码:page
# 每页数量:per_page
per_page = 10
# 手动分页功能:
# 数据 =[1,2,3,4,5,6....100]
# 第几页 数据范围 下标范围 [切片]
# page =1 1-10 0-9 [0:10]
# page =2 11-20 10-19 [10:20]
# page =3 21-30 20-29 [20:30]
# page =4 31-40 30-39 [30:40]
# page =5 41-50 40-49 [40:50]
# page =6 51-60 50-59 [50:60]
# page =n [(n-1)*10:n*10]
# page =page [(page-1)*per_page:page*per_page]
# 实现分页功能
persons = PersonModel.objects.all()
persons = persons[per_page * (page - 1) : per_page * page]
return render(request, "paginte.html", {"persons": persons, "page": page})
添加好路由
path("paginte/<int:page>", paginte, name="paginte"),
在路径中添加好页面参数
增加一个翻页按钮
可以用超链接创建翻页按钮
可以用循环遍历出数据库的所有数据计算出总页数
total = PersonModel.objects.count() # 总数据条数
total_page = math.ceil(total / 10) # 总页数
pages = range(1, total_page + 1) # 页码范围
分页器的使用方式
导入
from django.core.paginator import Paginator
def paginate2(request, page=1):
# 页码:page
# 每页数量:per_page
per_page = 10
all_data = PersonModel.objects.all()
# 分页器
paginator = Paginator(all_data, per_page)
persons = paginator.page(page) # 获取第page页的数据
pages = paginator.page_range # 获取页码范围 可遍历
data = {"persons": persons, "pages": pages}
return render(request, "paginate2.html", data)
实现的功能是一样的