Python从0到100(四十四):读取数据库数据
前言:
零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学习学习和学业的先行者!
欢迎大家订阅专栏:零基础学Python:Python从0到100最新最全教程!
一、获取全部记录
1.1 增加客户
在Python Web开发中,我们经常需要处理客户数据。首先,我们需要在数据库中添加一些客户记录。这可以通过Django的admin界面完成,或者直接在数据库中添加。以下是通过Django admin界面添加客户的示例:
此时就直接在我们的数据库管理中,出现了客户信息,也可以直接通过数据库里面的添加功能,在数据库里面添加。
1.2 获取所有表记录
接下来,我们将实现一个功能,当浏览器访问 sales/customers/
时,服务端返回系统中所有的客户记录。这可以通过Django的Model和QuerySet来实现。以下是views.py
中的示例代码:
from django.http import HttpResponse
from common.models import Customerdef listcustomers(request):# 获取所有客户记录的QuerySetqs = Customer.objects.values()retStr = ''# 遍历QuerySet,构建返回字符串for customer in qs:retStr += '<br>'.join([f'{name} : {value}' for name, value in customer.items()]) + '<br>'return HttpResponse(retStr)
Customer.objects.values() 就会返回一个 QuerySet 对象,这个对象是Django 定义的,在这里它包含所有的Customer 表记录。
QuerySet 对象 可以使用 for 循环遍历取出里面所有的元素。每个元素 对应 一条表记录。
每条表记录元素都是一个dict对象,其中 每个元素的 key 是表字段名,value 是 该记录的字段值
上面的代码就可以将 每条记录的信息存储到字符串中 返回给 前端浏览器。
1.3 修改路由表
为了让Django知道如何处理 sales/customers/
的请求,我们需要在urls.py
中添加相应的路由规则。
前面,我们在bysms\urls.py
主路由文件中,已经有如下的记录了:
# 凡是 url 以 sales/ 开头的,# 都根据 sales.urls 里面的 子路由表进行路由path('sales/', include('sales.urls')),
这条URL记录,指明 凡是 url 以 sales/ 开头的,都根据 sales.urls 里面的 子路由表进行路由。我们只需修改 sales/urls.py 即可,添加如下记录:
path('customers/', views.listcustomers),
大家可以使用 admin 登录, 再添加一些 客户记录。
然后可以在浏览器输入如下 网址: http://127.0.0.1:8080/sales/customers/
回车后,浏览器显示结果类似如下:
和我们数据库中的记录信息一致。
1.4 迁移数据库
定义好模型后,需要执行迁移来更新数据库结构:
python manage.py makemigrations
python manage.py migrate
1.5 使用Django Admin添加客户数据
为了让示例更加完整,我们使用Django Admin来添加一些初始客户数据。在admin.py
中注册Customer
模型:
from django.contrib import admin
from .models import Customeradmin.site.register(Customer)
启动Django开发服务器,并访问http://127.0.0.1:8000/admin
来添加客户数据。
1.6 创建视图以获取所有客户记录
在views.py
中,我们将创建一个视图函数来处理获取所有客户记录的请求:
from django.http import HttpResponse
from .models import Customerdef listcustomers(request):customers = Customer.objects.all().values()retStr = '<h1>所有客户记录</h1>'for customer in customers:retStr += f'<p>姓名: {customer["name"]}, 电话: {customer["phonenumber"]}, 地址: {customer["address"]}</p>'return HttpResponse(retStr)
1.7 配置URL路由
最后,我们需要在urls.py
中配置URL路由,以便将请求映射到我们的视图函数:
from django.urls import path
from . import viewsurlpatterns = [path('customers/', views.listcustomers),
]
二、根据条件过滤客户记录
2.1 理解过滤条件
过滤条件允许我们根据特定的参数来查询数据库中的记录。例如,我们可能只想获取电话号码为13000000001
的客户记录。
我们可以通过 filter 方法加入过滤条件,修改view里面的代码,如下所示:
def listcustomers(request):# 返回一个 QuerySet 对象 ,包含所有的表记录qs = Customer.objects.values()# 检查url中是否有参数phonenumberph = request.GET.get('phonenumber',None)# 如果有,添加过滤条件if ph:qs = qs.filter(phonenumber=ph)# 定义返回字符串retStr = ''for customer in qs:for name,value in customer.items():retStr += f'{name} : {value} | '# <br> 表示换行retStr += '<br>'return HttpResponse(retStr)
与刚才不同的是,我们加入了一段过滤条件:
# 检查url中是否有参数phonenumberph = request.GET.get('phonenumber',None)# 如果有,添加过滤条件if ph:qs = qs.filter(phonenumber=ph)
2.2 修改视图以支持过滤
看到函数定义的参数 request了:
Django 框架在 url 路由匹配到函数后, 调用函数时,会传入 一个 HttpRequest 对象给参数变量 request,该对象里面 包含了请求的数据信息。
HTTP 的 Get 请求url里面的参数(术语叫 querystring 里面的参数), 可以通过HttpRequest对象的 GET 属性获取。这是一个类似dict的对象。
比如要获取querystring里面的 phonenumber 参数 ,就可以像这样:
ph = request.GET.get('phonenumber',None)
第二个参数传入 None 表示,如果没有 phonenumber 参数在 querystring中 ,就会返回 None。
然后通过调用 QuerySet 对象的filter方法,就可以把查询过滤条件加上去:
qs = qs.filter(phonenumber=ph)
有了这个过滤条件,Django 会在底层执行数据库查询的SQL语句 加上相应的 where 从句,进行过滤查询。
注意,参数名 phonenumber 是和 定义的表 model 的属性名 phonenumber 一致的。
filter的过滤条件可以有多个,只要继续在后面的参数添加过滤条件即可。
比如:
qs = qs.filter(phonenumber=ph,address='山东青岛')
这样就 除了 根据电话号码字段过滤,还有根据 地址字段过滤。
2.3 测试过滤功能
启动Django开发服务器,然后在浏览器中访问以下URL来测试过滤功能:
http://127.0.0.1:8000/sales/customers/?phonenumber=13000000001
就可以只看到电话号码为13000000001
的客户记录。
结论
通过本篇文章,我们学习了如何在Django中获取和过滤客户记录。我们从创建模型开始,通过迁移更新数据库结构,使用Django Admin添加数据,然后创建视图来处理数据的获取和过滤。最后,我们配置了URL路由来将请求映射到相应的视图函数。希望这篇文章能帮助您更好地理解Django在Web开发中的应用,特别是在处理数据库记录方面的强大功能。