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 | 姓名 | 年龄 | 性别 |
---|---|---|---|
1 | zhangsan | 20 | man |
步骤:
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/ ,结果如下: