zoukankan      html  css  js  c++  java
  • CBV 序列化

    一、模型表

    from django.db import models
    
    # Create your models here.
    
    
    class Publish(models.Model):
        name = models.CharField(max_length=32)
        addr = models.CharField(max_length=128)
    
        def __str__(self):
            return self.name
    
    
    class Book(models.Model):
        title = models.CharField(max_length=16)
        price = models.DecimalField(max_digits=4, decimal_places=2)
        publisher = models.ForeignKey(to="Publish", on_delete=models.CASCADE)
        authors = models.ManyToManyField(to="Author")
    
        def __str__(self):
            return self.title
    
    
    class Author(models.Model):
        name = models.CharField(max_length=8)
        email = models.CharField(max_length=36)
    
        def __str__(self):
            return self.name

    二、序列化

    1、json 强转QuerySet->list

    class TestView(View):
        def get(self, request):
            print(request.GET)
            return render(request, "test.html")
            # return HttpResponse("get")
    
        def post(self, request):
            import json
            publish_list = list(Publish.objects.all().values("name", "addr"))
            return HttpResponse(json.dumps(publish_list, ensure_ascii=False))

    2、json 构建新的

    from django.shortcuts import render, HttpResponse
    from django.views import View
    from CBV.models import Publish, Book, Author
    from rest_framework import serializers
    
    # Create your views here.
    
    
    class PublishSer(serializers.Serializer):
        name = serializers.CharField()
        addr = serializers.CharField()
    
    
    class TestView(View):
        def get(self, request):
            print(request.GET)
            return render(request, "test.html")
            # return HttpResponse("get")
    
        def post(self, request):
            publish_list = Publish.objects.all()
            temp = []
            for publish in publish_list:
                temp.append({
                    "name": publish.name,
                    "addr": publish.addr,
                })
            print(temp)
            return HttpResponse(temp)
            # 结果:{'name': '北京出版社', 'addr': '北京'}{'name': '南京出版社', 'addr': '南京'}

    优化

    from django.shortcuts import render, HttpResponse
    from django.views import View
    from CBV.models import Publish, Book, Author
    from rest_framework import serializers
    from django.forms import model_to_dict
    # Create your views here.
    
    
    class PublishSer(serializers.Serializer):
        name = serializers.CharField()
        addr = serializers.CharField()
    
    
    class TestView(View):
        def get(self, request):
            print(request.GET)
            return render(request, "test.html")
            # return HttpResponse("get")
    
        def post(self, request):
            publish_list = Publish.objects.all()
            temp = []
            for publish in publish_list:
                temp.append(model_to_dict(publish))
            print(temp)
            return HttpResponse(temp)
            # 结果:{'name': '北京出版社', 'addr': '北京'}{'name': '南京出版社', 'addr': '南京'}

    注意:from djang.forms import model_to_dict

    3、Django序列化

    class TestView(View):
        def get(self, request):
            print(request.GET)
            return render(request, "test.html")
            # return HttpResponse("get")
    
        def post(self, request):
            # 方法3
            from django.core import serializers
            publish_list = Publish.objects.all()
            print(publish_list)
            # serialize里面添加的是queryset
            publish_json = serializers.serialize('json', publish_list)
            return HttpResponse(publish_json)
            # 结果: [{"model": "CBV.publish", "pk": 1, "fields": {"name": "u5317u4eacu51fau7248u793e", "addr": "u5317u4eac"}}, {"model": "CBV.publish", "pk": 2, "fields": {"name": "u5357u4eacu51fau7248u793e", "addr": "u5357u4eac"}}]

    4、rest_framwork

    from django.shortcuts import render, HttpResponse
    from django.views import View
    from CBV.models import Publish, Book, Author
    from rest_framework import serializers
    
    # Create your views here.
    
    
    class PublishSer(serializers.Serializer):
        name = serializers.CharField()
        addr = serializers.CharField()
    
    
    class TestView(View):
        def get(self, request):
            print(request.GET)
            return render(request, "test.html")
            # return HttpResponse("get")
    
        def post(self, request):
            publish_list = Publish.objects.all()
            ret = PublishSer(publish_list, many=True)
            return HttpResponse(ret.data)
            # 结果:OrderedDict([('name', '北京出版社'), ('addr', '北京')])OrderedDict([('name', '南京出版社'), ('addr', '南京')])

    注意:若序列化的是一个obj,那么many=False(默认),list many=True

     三、request

    A、Django 原生的request

    浏览器 ------------> 服务器

    浏览器发送请求到服务器

    1、POST

    POST的Request Heads 的 Content-Type: application/x-www-form-urlencoded

    只有contenttype 是 urlencode时,才会转化成QueryDict

    2、body

    直接捕获请求的content,如:b'{ "name":"tom", "age":18 }'

     B、rest_framework 的request

    1、data

    获取POST任意contenttype的数据,并反序列化

    2、other

    request._request.GET 也可以 request.GET

  • 相关阅读:
    jvisualm 结合 visualGC 进行jvm监控,并分析垃圾回收
    linux 查看服务器cpu 与内存配置
    arthas 使用总结
    selinux contexts 安全上下文的临时更改
    Android 8.1 Doze模式分析(五) Doze白名单及Debug方式
    Window 任意窗口置顶软件Window TopMost Control
    Android ApkToolPlus一个可视化的跨平台 apk 分析工具
    SVN Please execute the 'Cleanup' command.
    Android 如何在64位安卓系统中使用32位SO库
    Android cmd命令查看apk是32位还是64位?
  • 原文地址:https://www.cnblogs.com/wt7018/p/11453844.html
Copyright © 2011-2022 走看看