Django微讲解(八)
Django自带的序列化组件
之所以要把数据序列化就是为了以后项目前后端分离之后,用于前后端数据交互的,因为Django ORM产生的Queryset前端无法直
接识别,需要json格式的数据,前后端都可以直接识别,我们之前讲了Django返回json格式数据的关键字'JsonResponse',但是这不是最
简便的方式,Django有自带的序列化组件'serializers',操作简单,不会造成代码的冗余。
# 代码演示
from app01 import models
from django.http import JsonResponse
from django.core import serializers
def test_json(request):
# json_list = []
# user_info = models.Users.objects.filter().all()
# for user_obj in user_info:
# json_list.append({
# 'name':user_obj.name,
# 'age':user_obj.age,
# 'gender':user_obj.gender,
# 'gender_real':user_obj.get_gender_display(),
# 'addr':user_obj.addr
# })
# return JsonResponse(json_list,safe=False)
user_info = models.Users.objects.filter().all()
res = serializers.serialize('json',user_info)
return HttpResponse(res)
批量数据操作
# 循环插入数据
循环插入多条数据,会频繁的走数据库,每循环一次就会走一次数据库,数据库在频繁的使用同一步操作,效率会越来越低。
代码演示:
def many_data(request):
for i in range(100000):
models.Book.objects.create(title=f'第{i}本书')
data_obj = models.Book.objects.filter().all()
return render(request,'many_data.html',locals())
# 批量插入数据
批量插入会降低数据库的压力,插入数据的效率也会大大提高,批量插入数据使用的关键字是'bulk_create'
代码演示:
def many_data(request):
# 定义一个空列表
book_list = []
for i in range(1000,2000):
# 先实例化一个对象
book_obj = models.Book(title=f'第{i}本书')
# 将对象追加到列表当中
book_list.append(book_obj)
# 批量插入数据
models.Book.objects.bulk_create(book_list)
data_obj = models.Book.objects.filter().all()
return render(request,'many_data.html',locals())
分页器推导及自定义分页器使用
# 1.分页器推导流程
我们刚刚在展示数据的时候就发现,一个页面有太多的数据,不便于查看,也不美观,所以我们就可以加一个分页器,限制数据的
展示条数,便于查看。
1.我们用'all()'方法可以拿到所有的数据结果集,拿到的数据结果集支持正数的索引切片,所以就可以限制数据的只能是条数
2.关于分页数据的起始,结束参数,要计算参数的数学关系
3.用后端代码渲染前端分页代码
4.用后端代码限制分页展示的数量
5.限制分页器数字的范围
# 2.自定义分页器使用
因为分页器的使用范围很广泛,所以我们就可以自定义一个分页器,封装成模块,虽然Django给我们提供了分页器,但是不太好
用。当我们自定义模块文件的时候,我们可以先在Django的应用文件下或者Django项目文件下建立一个'utils'文件夹,在里面封装我们
自己的模块,便于使用。
代码演示:
# views层代码
from utils import mypage
def many_data(request):
book_queryset = models.Book.objects.all()
# 产生分页器对象
page_obj = mypage.Pagination(current_page=request.GET.get('page'),all_count=book_queryset.count())
# 产生分页数据对象
page_queryset = book_queryset[page_obj.start:page_obj.end]
return render(request,'many_data.html',locals())
# html层代码,提前导入好bootstrap文件
{% for book_obj in page_queryset %}
<p>{{ book_obj.title }}</p>
{% endfor %}
{{ page_obj.page_html|safe }}
1.基本使用
当我们想要编写一个校验用户名和密码是否合法的功能,是需要做很多事情的,前端需要自己编写获取用户数据的各种标签,
还需要展示错误的提示信息,后端需要编写校验代码等等。以上的操作我们都可以使用forms组件来完成,先来看看基本使用。
# 代码演示
from django import forms
class MyForm(forms.Form):
username = forms.CharField(min_length=3,max_length=8) # 用户名最少三个字符,最多八个字符
age = forms.IntegerField(min_value=0,max_value=110) # 年龄最小0岁,最大110岁
email = forms.EmailField() # 邮箱输入必须遵循邮箱格式,必须带有@关键符
2.检验数据
from app01 import views
# 1.将数据传入实例化对象
form_obj = views.MyForm({'username':'oscar','age':21,'email':'111qq'})
# 2.查看数据是否合法
print(form_obj.is_valid()) # False,只有全部正确才会返回True
# 3.查看不符合条件的数据及原因
print(form_obj.errors)
# 4.查看符合条件的数据
print(form_obj.cleaned_data)
# 5.forms类中的字段
forms类中的所有字段数据默认都是必填的,不填就会报错,如果想要忽略某些字段,我们可以在创建forms类的时候给该字段
加上'required=False'属性即可
# 6.多传的数据
forms类中额外多传的数据不会做任何的校验,会直接忽略
3.渲染标签
# 1.渲染方式一
封装程度高,但是扩展性很差,主要用于快速生成页面测试功能
{{ my_forms.as_p }} # 渲染出来的效果是成列的
{{ my_forms.as_table }} # 渲染出来的效果是成行的
{{ my_forms.as_ul }} # 渲染出来的效果是无需列表形式的
# 2.渲染方式二
封装程度低,扩展性较好,但是字段多的话就会比较繁琐
{{ my_forms.字段名.label }} # 文本提示
{{ my_forms.字段名 }} # 获取用户数据的标签
# 3.渲染方式三(推荐使用)
{% for form in my_forms %}
<p>
{{ form.label }}
{{ form }}
</p>
{% endfor %}
'''
1.forms组件只负责渲染获取用户数据的标签,form表单的标签和提交按钮需要自己写
2.如果想要自定义标签的提示,可以给字段加上label属性,参数就是自定义的提示,不写默认是字段名,并且首字母是大写
'''
4.展示信息
# 1.form表单取消浏览器自动校验
<form action="" method="post" novalidate></form>
# 2.错误展示信息
由于前端的校验是可有可无的,所以我们就在添加校验功能
# 后端代码
def myforms(request):
my_forms = MyForm()
if request.method == 'POST':
# 获取用户数据,request.POST可以看成是一个数据字典
my_forms = MyForm(request.POST)
# 校验用户数据
if my_forms.is_valid():
# models.Book.objects.create(**my_forms.is_valid()) # 打散批量插入数据
return HttpResponse('数据正确')
return render(request,'myforms.html',locals())
# 前端代码
{% for form in my_forms %}
<p>
{{ form.label }}
{{ form }}
<span style="color: red">{{ form.errors.0 }}</span>
</p>
{% endfor %}
# 3.自定义错误提示信息
关于错误提示信息我们还可以自定义,只需要给字段添加'error_messages'属性,参数只一个字典格式,字典的key值就是
关键字,value值就是提示信息
代码演示:
username = forms.CharField(min_length=3,max_length=8,
error_messages={
'min_length':'最短3位',
'max_length':'最长8位',
'required':'用户名必填'
}
)