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 Customer
def listcustomers(request):
# 获取所有客户记录的QuerySet
qs = 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/
回车后,浏览器显示结果类似如下:
和我们数据库中的记录信息一致。
此时我们通过F12进行抓包处理:
会发现此时的<br>
就是我们的换行指令。
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 Customer
admin.site.register(Customer)
启动Django开发服务器,并访问http://127.0.0.1:8000/admin
来添加客户数据。
1.6 创建视图以获取所有客户记录
在views.py
中,我们将创建一个视图函数来处理获取所有客户记录的请求:
from django.http import HttpResponse
from .models import Customer
def 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 views
urlpatterns = [
path('customers/', views.listcustomers),
]
二、根据条件过滤客户记录
2.1 理解过滤条件
过滤条件允许我们根据特定的参数来查询数据库中的记录。例如,我们可能只想获取电话号码为13000000001
的客户记录。
我们可以通过 filter 方法加入过滤条件,修改view里面的代码,如下所示:
def listcustomers(request):
# 返回一个 QuerySet 对象 ,包含所有的表记录
qs = Customer.objects.values()
# 检查url中是否有参数phonenumber
ph = 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中是否有参数phonenumber
ph = 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开发中的应用,特别是在处理数据库记录方面的强大功能。
- 点赞
- 收藏
- 关注作者
评论(0)