Django模型基础-模型操作-查询数据

查询数据

# 查询数据
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)

 实现的功能是一样的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值