Django(18)-ORM常用的查询函数详解及实例演示

Django(1)-简介

Django(2)-创建项目及默认项目目录结构介绍

Django(3)-配置文件详解

Django(4)-URL和视图

Django(5)-路由配置实例

Django(6)-请求及响应

Django(7)-Get请求和Post请求

Django(8)-设计模式

Django(9)-模板层简介与入门实例

Django(10)-模板层的变量和标签

Django(11)-模板层的过滤器和继承

Django(12)-url反向解析

Django(13)-静态文件

Django(14)-应用及分布式路由

Django(15)-模型层及ORM介绍

Django(16)-ORM基础字段及选项

Django(17)-ORM创建数据

Django(18)-ORM常用的查询函数详解及实例演示

Django(19)-ORM条件查询

Django(20)-ORM更新操作及实例演示

Django(21)-ORM删除操作及实例演示

Django(22)-ORM中F对象和Q对象

Django(23)-ORM聚合查询和原生数据库操作

Django(24)-admin后台管理设置步骤以及常见样式详解

Django实战技巧(1)-开发测试生产环境配置切换处理技巧

Django实战技巧(2)-git代码仓分支管理技巧

Django实战技巧(3)-项目配置

1、查询简介

  • 数据库的查询需要使用管理器对象进行
  • 通过MyModel.objects管理器方法调用查询方法
    • all():查询全部记录,返回QuerySet查询对象
    • get():查询符合条件的单一记录
    • filter():查询符合条件的多条记录
    • exclude():查询符合条件之外的全部记录
    • 等等

2、常用的查询方法详解

  • all()发方法:

    • 用法:MyModel.objects.all()
    • 作用:查询MyModel实体中的所有的数据
    • 等同于 select * from table
    • 返回值:QuerySet容器对象,内部存放MyModel实例

    如:

>>> from app1.models import Person
>>> persons=Person.objects.all()
>>> for person in persons:
...     print("姓名:",p.name,"\n年龄:",p.age,"\n性别:",p.sex)
...
姓名: lisi
年龄: 25
性别: man
姓名: lisi
年龄: 25
性别: man
>>>
>>>> persons
<QuerySet [<Person: Person object (1)>, <Person: Person object (2)>]>

为了更好的直接显示数据,可以在模型类中实现一个__str__的魔法函数,如模型类代码如下,增加一个魔法函数:

from django.db import models

# Create your models here.


class Person(models.Model):
    name=models.CharField("姓名",max_length=50,default='')
    age=models.IntegerField("年龄")
    sex=models.CharField("性别",max_length=20,default='')
    
    def __str__(self):
        return f"姓名:{self.name},年龄:{self.age},性别:{self.sex}"

    class Meta:
        db_table="person"

然后退出django shell,重新进入django shell,如下:此时可以很清晰的看出all()查询到的对象中的数据

>>> exit()

(django-5F60hEIM) (python39) G:\src\django\mysite1>python manage.py shell
Python 3.9.1 (default, Dec 11 2020, 09:29:25) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from app1.models import Person
>>> persons=Person.objects.all()
>>> persons
<QuerySet [<Person: 姓名:zhangsan,年龄:30,性别:man>, <Person: 姓名:lisi,年龄:25,性别:man>]>
>>>
  • values("列1”,“列2”)
    • 用法:MyModel.objects.values(…)
    • 作用:查询部分列的数据并返回
    • 等同于 select 列1,列2 from xxx
    • 返回值:QuerySet对象,返回查询结果容器,容器内存字典,每个字典代表一条数据,格式为:
      {“列1”:值1,“列2”:值2}

如下:

>>> from app1.models import Person
>>> person=Person.objects.values("name","age")
>>> person
<QuerySet [{'name': 'zhangsan', 'age': 30}, {'name': 'lisi', 'age': 25}]>
>>> for p in person:
...     print(p["name"],p["age"])
...
zhangsan 30
lisi 25
>>>
  • values_list(“列1”,“列2”…)
    • 用法:MyModel.objects.values_list(…)
    • 作用:返回元组形式的查询结果
    • 等同与 select 列1,列2 from xxx
    • 返回值:QuerySet容器对象,内部存放‘元组’,会将查询出来的数据封装到元组中,再封装到查询集合QuerySet中
      如:
>>> from app1.models import Person
>>> persons=Person.objects.values_list("name","age")
>>> persons
<QuerySet [('zhangsan', 30), ('lisi', 25)]>
>>> for person in persons:
...     print(person[0],person[1])
...
zhangsan 30
lisi 25
>>>
  • order_by()
    • 用法:MyModel.objects.order_by('-列‘,‘列’)
    • 作用:与all()方法不同,它会用SQL语句的ORDER BY 子句对查询结果进行根据某个字段选择性的进行排序
    • 说明:默认是按照升序排序,降序排序则需要在列前加’-‘表示
      如:
>>> from app1.models import Person
>>> persons=Person.objects.order_by("name")
>>> persons
<QuerySet [<Person: 姓名:lisi,年龄:25,性别:man>, <Person: 姓名:zhangsan,年龄:30,性别:man>]>
>>> persons=Person.objects.order_by("-name")
>>> persons
<QuerySet [<Person: 姓名:zhangsan,年龄:30,性别:man>, <Person: 姓名:lisi,年龄:25,性别:man>]>
>>>

只要返回结果是QuerySet,其后可继续叠加使用这些函数的,如:

>>> from app1.models import Person
>>> persons=Person.objects.values("name").order_by("age")
>>> persons
<QuerySet [{'name': 'lisi'}, {'name': 'zhangsan'}]>
>>> persons=Person.objects.values("name").order_by("-age")
>>> persons
<QuerySet [{'name': 'zhangsan'}, {'name': 'lisi'}]>
>>>

通过打印对象.query可以查看到后台执行的SQL语句,如:

>>> from app1.models import Person
>>> persons=Person.objects.values("name").order_by("age")
>>> persons
<QuerySet [{'name': 'lisi'}, {'name': 'zhangsan'}]>
>>> persons.query
<django.db.models.sql.query.Query object at 0x000001CB12117C10>
>>> print(persons.query)
SELECT `person`.`name` FROM `person` ORDER BY `person`.`age` ASC
>>> persons=Person.objects.values("name").order_by("-age")
>>> persons
<QuerySet [{'name': 'zhangsan'}, {'name': 'lisi'}]>
>>> print(persons.query)
SELECT `person`.`name` FROM `person` ORDER BY `person`.`age` DESC
>>>

实例演示:

  • 制作一个查询所有人员信息的页面
  • 视图函数 all_person
  • url: http://127.0.0.1:8080/app1/all_person
    格式类似如下:
id姓名年龄性别
1zhangsan20man

步骤:
1、在app1应用中编写视图函数如下:

from django.http import HttpResponse
from django.shortcuts import render
from .models import Person

# Create your views here.

def all_person(request):
    all_person=Person.objects.all()

    return render(request,"app1/all_person.html",locals())

2、在app1/templates/app1/ 目录下创建all_person.html文件,内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>所有人员信息</title>
</head>
<body>
<table border="1">
    <tr>
        <th>id</th>
        <th>姓名</th>
        <th>年龄</th>
        <th>性别</th>
    </tr>
    {% for person in all_person %}
        <tr>
            <th>{{person.id}}</th>
            <th>{{person.name}}</th>
            <th>{{person.age}}</th>
            <th>{{person.sex}}</th>
        </tr>
    {% endfor %}
</table>
</body>
</html>

3、在app1应用下的urls.py路由文件中设置如下路由:
在这里插入图片描述
4、在主路由文件中注册app1的路由,如下:
在这里插入图片描述
5、在浏览器中打开http://127.0.0.1:8080/app1/all_person/ ,结果如下:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

redrose2100

您的鼓励是我最大的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值