Django自带的序列化组件


目录
  • django自带的序列化组件
  • 批量数据操作
  • 分页器推导流程
    • 简易版本
    • 优化版本
  • Forms组件
  • 校验数据
  • 渲染标签
  • 展示信息

django自带的序列化组件

# 方式一
def transfer_data(request):
    # 前后端分离之后django orm产生的queryset无法直接被前端识别需要通过json格式交互
    data_list = []
    user_queryset = models.User.objects.all()
    for user_obj in user_queryset:
        data_list.append({
            'pk': user_obj.pk,
            '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(data_list, safe=False)
# 方式二
def transfer_data(request):
    user_queryset = models.User.objects.all()
    res = serializers.serialize('json', user_queryset)
    return HttpResponse(f'



{res}

')

批量数据操作

# 方式一,速度太慢
def bulk_data(request):
    # 循环插入1万条数据
    for i in range(1, 1000):
        models.Book01.objects.create(title=f'第{i}本书')
    page_queryset = models.Book01.objects.all()
    return render(request, 'bulk_data.html', locals())
# 方式二,推荐
def bulk_data(request):
    # 批量插入入1万条数据
    book_list = []
    for i in range(1, 10000):
        # 先用类产生一个对象
        source_book_obj = models.Book01(title=f'遮天-第{str(i).zfill(4)}章')
        # 将对象追加到列表中
        book_list.append(source_book_obj)
    models.Book01.objects.bulk_create(book_list)
    page_queryset = models.Book01.objects.all()
    return render(request, 'bulk_data.html', locals())

分页器推导流程

简易版本

def bulk_data(request):
    # book_list = []
    # for i in range(1, 10000):
    #     # 先用类产生一个对象
    #     source_book_obj = models.Book01(title=f'遮天-第{str(i).zfill(4)}章')
    #     # 将对象追加到列表中
    #     book_list.append(source_book_obj)
    # models.Book01.objects.bulk_create(book_list)
    data_queryset = models.Book01.objects.all()
    # 获取用户想要查看的页码
    current_page_num = request.GET.get('page')
    try:
        current_page_num = int(current_page_num)
    except Exception:
        current_page_num = 1
    per_page_num = 10
    # 起始位置
    start_num = (current_page_num - 1) * per_page_num
    # 终止位置
    stop_num = current_page_num * per_page_num
    show_num = 11
    all_count = data_queryset.count()
    page_num, more = divmod(all_count, per_page_num)
    if more:
        page_num += 1
    html = ''
    page = current_page_num
    if current_page_num < 6:
        page = 6
    for i in range(page-5, page+6):
        if current_page_num == i:
            html += '
  • %s
  • ' % (i, i) else: html += '
  • %s
  • ' % (i, i) book_queryset = data_queryset[start_num:stop_num] return render(request, 'bulk_data.html', locals())

    优化版本

    def bulk_data(request):
        data_queryset = models.Book01.objects.all()
        from utils import mypage
        book_queryset = models.Book01.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, 'bulk_data.html', locals())
    

    Forms组件

    # 前戏
      需求:编写一个校验用户名和密码是否合法的功能
      前端需要编写获取用户数据的各种标签
      前端需要想方设法的展示错误的提示信息
      后端需要想方设法的编写校验代码(很多if判断)
      
    # form组件
      form组件可以一次性搞定上面的三件事
      1.数据校验
      2.标签渲染
      3.展示信息
    
    # 基本使用
    from django import forms
    class MyForm(forms.Form):
        # 用户名至少五个字符最多十个字符
        username = forms.CharField(min_length=5,max_length=10)
        # 年龄最小不能小于0,最大不能超过120
        age = forms.IntegerField(min_value=0,max_value=120)
        # 邮箱必须符合邮箱格式(@关键符号)
        email = forms.EmailField()
    

    校验数据

    from app01 import views
    # 将数据传入实例化对象
    form_obj =MyForm({'username':'linda','age':24,'email':'6666'})
    # 查看数据是否合法(全部合法才是True)
    form_obj.is_valid()
    # 查看不符合条件的数据及原因
    form_obj.errors
    	{'age': ['Ensure this value is less than or equal to 120.']}
    # 查看符合条件的数据
    form_obj.cleaned_data
    	{'username': 'linda', 'age': 24}
    
    # forms类中所有的字段数据默认都是必填
    	忽略某些字段的方法 required=False
    # forms类中额外传入的字段数据不会做任何的校验
    

    渲染标签

    渲染方式1:封装程度高 扩展性较差 主要用于快速生成页面测试功能
      {{ form_obj.as_p }}
      {{ form_obj.as_table }}
      {{ form_obj.as_ul }}
    渲染方式2:封装程度低 扩展性较好 字段较多的情况下开发效率较低
      {{ form_obj.username.label }}  # 文本提示
      {{ form_obj.username }}	     # 获取用户数据的标签
    渲染方式3:推荐使用
      {% for form in form_obj %}
          

    {{ form.label }} {{ form }}

    {% endfor %} # forms组件只负责渲染获取用户数据的标签,form表单标签和提交按钮需要自己写 注意:渲染标签中文提示可以使用参数label指定,不指定默认使用字段名首字母大写

    展示信息

    class MyForm(forms.Form):
        # 用户名至少五个字符最多十个字符
        username = forms.CharField(min_length=5, max_length=10, label='用户名',
                                   error_messages={
                                       'min_length': '用户名最短5位',
                                       'max_length': '用户名最长10位',
                                       'required': '用户名必填'
                                   }
    
                                   )
        # 年龄最小不能小于0,最大不能超过120
        age = forms.IntegerField(min_value=0, max_value=120, label='年龄',
                                 error_messages={
                                     'min_value': '年龄不能小于0',
                                     'max_value': '年龄不能大于120',
                                 }
                                 )
        # 邮箱必须符合邮箱格式(@关键符号)
        email = forms.EmailField(label='邮箱',
                                 error_messages={
                                     '': '邮箱必须含有@符号'  # 没有效果
                                 })