Django-18-ORM单表查询详解

本文详细介绍了Django ORM中13种查询数据库的方法,包括all(), filter(), exclude(), order_by(), reverse(), values(), values_list(), distinct(), get(), first(), last(), exists(), count()等,并通过实例展示了每种方法的使用场景。
摘要由CSDN通过智能技术生成

前提(初始表)

 

查询集

Django查询数据库的13个方法

返回结果是对象列表:all(),filter(),exclude(),order_by(),reverse(),values(),values_list(),distinct()

返回结果是对象:get(),first(),last()

返回结果是布尔值:exists()

返回结果是数字:count()

 

django_study.app01.views.py:新建一个select_db视图函数

from django.shortcuts import render  # 导入显示页面的模块
from django.http import HttpResponse  # 导入显示字符串的模块
from .models import *  # 导入操作的模型类

# Create your views here.

def select_db(request):
    return HttpResponse("查询成功")

django_study.django_study.urls:绑定url与视图函数

url(r'^select_db/$', select_db)

 

all()

获取所有数据,相当于sql中的*,select * from user;

def select_db(request):
    res = User.objects.all()
    """
    返回的res是一个可迭代对象,可通过下标取某个元素(对象)
    """
    return HttpResponse("""
    <p>通过下标取第一个数据:%s</p>
    <p>第一个数据的name属性值:%s</p>
    """%(res[0], res[0].name))

 

启动状态运行后查看

 

filter()

筛选满足条件的数据,相当于sql中的where,select * from user where "age"=25;

def select_db(request):
    # 筛选出age=25的数据
    res = User.objects.filter(age=25)  
    """
    返回的res是一个可迭代对象,可通过下标取某个元素(对象)
    """
    return HttpResponse("""
    <p>通过下标取第一个数据:%s</p>
    <p>第一个数据的name属性值:%s</p>
    <p>第二个数据的name属性值:%s</p>
    """%(res[0], res[0].name, res[1].name))

 

启动状态运行后查看

 

 

exclude()

获取不满足条件的数据,与filter相反

def select_db(request):
    # 筛选出age=25以外的数据
    res = User.objects.exclude(age=25)
    """
    返回的res是一个可迭代对象,可通过下标取某个元素(对象)
    """
    return HttpResponse("""
    <p>通过下标取第一个数据:%s</p>
    <p>第一个数据的name属性值:%s</p>
    <p>第二个数据的name属性值:%s</p>
    """%(res[0], res[0].name, res[1].name))

启动状态运行后查看

 

order_by()

对查询结果排序(默认升序)

def select_db(request):
    # 按年龄排序(升序)
    res = User.objects.all().order_by("age")
    """
    返回的res是一个可迭代对象,可通过下标取某个元素(对象)
    """
    return HttpResponse("""
    <p>通过下标取第一个数据:%s</p>
    <p>第一个数据的name为:%s,age为:%s</p>
    """%(res[0], res[0].name, res[0].age))

启动状态运行后查看

 

降序显示,只需要-age即可

def select_db(request):
    # 按年龄排序(降序)
    res = User.objects.all().order_by("-age")
    """
    返回的res是一个可迭代对象,可通过下标取某个元素(对象)
    """
    return HttpResponse("""
    <p>通过下标取第一个数据:%s</p>
    <p>第一个数据的name为:%s,age为:%s</p>
    """%(res[0], res[0].name, res[0].age))

 

启动状态运行后查看

 

reverse()

倒叙显示

def select_db(request):
    # 按年龄升序后,倒序显示,相当于-age
    res = User.objects.all().order_by("age").reverse()
    """
    返回的res是一个可迭代对象,可通过下标取某个元素(对象)
    """
    return HttpResponse("""
    <p>通过下标取第一个数据:%s</p>
    <p>第一个数据的name为:%s,age为:%s</p>
    """%(res[0], res[0].name, res[0].age))

启动状态运行后查看

 

values()

返回一个字典数据

values("name","age")相当于sql:select name, age from user;

def select_db(request):
    # res为一个字典元素的列表,values后面的表示只需显示name和age字段
    res = User.objects.all().values("name", "age")
    """
    返回的res是一个可迭代对象,可通过下标取某个元素(对象)
    """
    return HttpResponse("""
    <p>通过下标取第一个元素:%s</p>
    <p>通过下标取第二个元素:%s</p>
    """%(res[0], res[1]))

 

启动状态运行后查看

 

如果需要显示所有字段,values()里面不加参数即可,默认显示所有

def select_db(request):
    # res为一个字典元素的列表,values后无参数,代表显示所有字段
    res = User.objects.all().values()
    """
    返回的res是一个可迭代对象,可通过下标取某个元素(对象)
    """
    return HttpResponse("""
    <p>通过下标取第一个元素:%s</p>
    <p>通过下标取第二个元素:%s</p>
    """%(res[0], res[1]))

 

启动状态运行后查看

 

values_list()

跟values()差不多,只不过它是返回的数据是元组格式

def select_db(request):
    # res为一个元组的列表,values后无参数,代表显示所有字段
    res = User.objects.all().values_list()
    print(res)
    """
    返回的res是一个可迭代对象,可通过下标取某个元素(对象)
    """
    return HttpResponse("""
    <p>通过下标取第一个元素:%s</p>
    <p>通过下标取第二个元素:%s</p>
    """%(res[0], res[1]))

 

启动状态运行后查看

 

distinct()

从返回结果中去重

def select_db(request):
    """
    1.用age_list来存放区重后的age列表
    2.values/values_list和distinct混合使用没有先后顺序
    2.如果想用distinct的话,在distinct前面需要加上values或values_list
    原理:相当于values获得了一个列表然后set()或values_list获得了一个数组然后set()
    """
    age_list = []
    res = User.objects.all().values("age").distinct()
    for i in res:
        age_list.append(i)
    return HttpResponse("去重后的age列表为:%s"%age_list)

 

启动状态运行后查看

get()

返回单个满足条件的对象,如果未找到会引发“模型类.DoesNotExist”异常;如果多条被返回,会引发“模型类.MultipleObjectsReturned”异常

 

 

def select_db(request):
    res = User.objects.get(name="wang")
    return HttpResponse("""
    <p>获取对象的age为:%s</p>
    <p>获取对象的sex为:%s</p>
    """%(res.age, res.sex))

启动状态运行后查看

 

first()/last()

def select_db(request):
    # 筛选出sex="女"的数据后分别取第一条/最后一条
    first_data = User.objects.filter(sex="女").first()
    last_data = User.objects.filter(sex="女").last()
    return HttpResponse("""
    <p>获取第一个对象的name为:%s</p>
    <p>获取第一个对象的age为:%s</p>
    <p>获取最后一个对象的name为:%s</p>
    <p>获取最后一个对象的age为:%s</p>
    """%(first_data.name, first_data.age, last_data.name, last_data.age))

启动状态运行后查看

 

exists()

如果存在返回True,不存在返回False

def select_db(request):
    res = User.objects.filter(name="suner").exists()
    res1 = User.objects.filter(name="sun").exists()
    return HttpResponse("""
    <p>res:%s</p>
    <p>res1:%s</p>
    """%(res, res1))

启动状态运行后查看

 

 

count()

返回当前查询的总条数

 

def select_db(request):
    res = User.objects.filter(sex="男").count()
    return HttpResponse("查询总条数为:%s"%res)

启动状态运行后查看

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值