[Python自学] restframework

一、数据序列化的几种方式

在Django的视图函数中,我们从数据库中获取数据,由以下几种方式将其序列化成JSON数据:

1.方式一

class PublishView(View):
    def get(self, request):
        publish_list = list(Publish.objects.all().values())
        return HttpResponse(json.dumps(publish_list))

通过list强转的方式。

前台接收到的数据:

[{"id": 1, "name": "\u6e05\u534e\u5927\u5b66\u51fa\u7248\u793e", "email": "[email protected]"}, {"id": 2, "name":
"\u5de5\u4e1a\u51fa\u7248\u793e", "email": "[email protected]"}, {"id": 3, "name": "\u90ae\u7535\u51fa\u7248\u793e", "email":
"[email protected]"}, {"id": 4, "name": "\u56db\u5ddd\u6587\u5b66\u51fa\u7248\u793e", "email": "[email protected]"}]

2.方式二

class PublishView(View):
    def get(self, request):
        publish_list = Publish.objects.all()
        temp = []
        for obj in publish_list:
            temp.append({
                ‘id‘: obj.id,
                ‘name‘: obj.name,
                ‘email‘: obj.email
            })

        return HttpResponse(json.dumps(temp))

通过字段拼接的方式。

使用model_to_dict方法来将对象转换成字典:

class PublishView(View):
    def get(self, request):
        from django.forms.models import model_to_dict
        publish_list = Publish.objects.all()
        temp = []
        for obj in publish_list:
            temp.append(model_to_dict(obj))

        return HttpResponse(json.dumps(temp))

前台接收到的数据:

[{"id": 1, "name": "\u6e05\u534e\u5927\u5b66\u51fa\u7248\u793e", "email": "[email protected]"}, {"id": 2, "name":
"\u5de5\u4e1a\u51fa\u7248\u793e", "email": "[email protected]"}, {"id": 3, "name": "\u90ae\u7535\u51fa\u7248\u793e", "email":
"[email protected]"}, {"id": 4, "name": "\u56db\u5ddd\u6587\u5b66\u51fa\u7248\u793e", "email": "[email protected]"}]

3.方式三

利用django中的序列化组件:·

class PublishView(View):
    def get(self, request):
        from django.core import serializers
        publish_list = Publish.objects.all()
        ret = serializers.serialize("json", publish_list)

        return HttpResponse(ret)

前台接收到的数据:

[{"model": "demo.publish", "pk": 1, "fields": {"name": "\u6e05\u534e\u5927\u5b66\u51fa\u7248\u793e", "email":
"[email protected]"}}, {"model": "demo.publish", "pk": 2, "fields": {"name": "\u5de5\u4e1a\u51fa\u7248\u793e", "email":
"[email protected]"}}, {"model": "demo.publish", "pk": 3, "fields": {"name": "\u90ae\u7535\u51fa\u7248\u793e", "email":
"[email protected]"}}, {"model": "demo.publish", "pk": 4, "fields": {"name": "\u56db\u5ddd\u6587\u5b66\u51fa\u7248\u793e",
"email": "[email protected]"}}]

4.方式四

利用restframework中的serializer:

from rest_framework import serializers

class PublishSerializers(serializers.Serializer):
    name = serializers.CharField()
    email = serializers.EmailField()

class PublishView(View):
    def get(self, request):
        publish_list = Publish.objects.all()
        # 如果序列化queryset,则需要参数many=True
        ps = PublishSerializers(publish_list, many=True)
        # 如果是queryset其中一个obj,则不需要many参数
        # ps = PublishSerializers(obj)
        return HttpResponse(ps.data)

这种方式的前提是安装djangorestframework。

前端接收到的数据:

OrderedDict([(‘name‘, ‘清华大学出版社‘), (‘email‘, ‘[email protected]‘)])OrderedDict([(‘name‘, ‘工业出版社‘), (‘email‘,
‘[email protected]‘)])OrderedDict([(‘name‘, ‘邮电出版社‘), (‘email‘, ‘[email protected]‘)])OrderedDict([(‘name‘, ‘四川文学出版社‘), (‘email‘,
‘[email protected]‘)])

数据是多个有序字典组成的列表。

二、安装restframe

pip install djangorestframework

三、POST请求的Content-Type

当我们使用postman发送POST请求时,选择form-data或x-www-form-urlencoded内容类型发送:

对应请求头中的Content-Type为application/x-www-form-urlencoded

Django收到请求后,会将body中的数据a=1&b=2转化为request.POST字典。

<QueryDict: {‘a‘: [‘11‘], ‘b‘: [‘2‘]}>  # django自动帮我们将body中的数据转换为字典

但是,如果内容类型选择raw-->Json发送:

对应请求头中的Content-Type为application/json

Django收到请求后,不会自动将其转换为request.POST。

<QueryDict: {}>  # 拿到的request.POST是空的

这时,我们通过request.body可以拿到原始的body数据:

b‘{"a":"1","b":"2"}‘

6

原文地址:https://www.cnblogs.com/leokale-zz/p/12228597.html

时间: 2024-08-01 09:26:40

[Python自学] restframework的相关文章

[Python自学] restframework (5) (解析器)

一.数据解析器 1.Django默认的数据解析 在我们使用django框架时,浏览器如果发送以下类型的POST数据: Content-Type=application/x-www-form-urlencoded Content-Type=application/form-data 则django会自动帮我们将请求体中的数据转换为字典,保存在request.POST中. 但是,如果浏览器发送的是json数据: Content-Type=application/json 则django无法为我们转换

python自学笔记

python自学笔记 python自学笔记 1.输出 2.输入 3.零碎 4.数据结构 4.1 list 类比于java中的数组 4.2 tuple 元祖 5.条件判断和循环 5.1 条件判断 5.2 循环 6.使用dict和set 6.1 dict 6.2 set 7.函数的使用 7.1函数返回多个值,同时接受多个值 7.2函数参数的默认值 7.3可变参数的函数 7.4可变个数带参数名的入参 7.5参数类型组合 8.关于函数递归 9.python的高级特性 9.1切片 9.2遍历 9.3列表生

Python - 自学django,上线一套资产管理系统

一.概述 终于把公司的资产管理网站写完,并通过测试,然后上线.期间包括看视频学习.自己写前后端代码,用时两个多月.现将一些体会记录下来,希望能帮到想学django做web开发的人.大牛可以不用看了,小白的第一个项目,写的很low,不入眼. 二.过程 1. python自学断断续续都有好长的时间,总是零零散散,没有去完完全全开发一个项目出来,跟别人说我会python,都没有啥说服力.后来下定决心,用python去做一个网站出来.正好公司平常维护资产的时候使用的是excel表,十分不科学.领导有意思

[Python自学] 项目发布流程

一.上线准备工作 1.准备Python虚拟环境:[Linux系统] CentOS7创建Python虚拟环境 2.安装Python依赖:[Python自学] 批量安装依赖 3.部署MariaDB:[数据库] MariaDB安装及使用 4.部署Redis集群:[NoSQL数据库] Redis集群部署 5.使用uWSGI运行项目:[Python自学] uWSGI启动django项目 5.部署Nginx:[Linux系统] (8)Nginx 6.使用LVS(可选):[Linux系统] (6)LVS负载均

Python 自学不求人

自学 Python 不求人,本文介绍 Python 自学时如何获取免费权威的帮助信息. 概述 如何使用 Python 自带的 help() 方法 如何利用 Python 文档 获取中文文档 获取帮助 help 每次进入 python 解释器的交互模式时,都会先打印横幅消息,在版本信息下面就是推荐 的命令: Type "help", "copyright", "credits" or "license" for more inf

Python 自学感想

将近三十岁的我回想了一下以前的种种......感到一种莫名伤感与无奈.伤感是因为:将近三十的我还是一事无成,身无分文,浪费太多的时间在一些无用的东西上面(比如:游戏).无奈是因为:只能眼睁睁的看着时间随风飘逝,而没有任何办法留住它,任它腐蚀着我的身心. 向前面的路望了望,只看到了无尽的深渊与绝望.我看不到以后的路,找寻不到一点希望.还是玩游戏吧,至少玩的时候心里不会想到这些烦心事,但是玩过之后,又是一阵无尽的空虚与伤感.于是删了游戏,(删了装,装了又删,自已都不记得重复了多少次了)强硬着逼自己再

Python 自学笔记(一)环境搭建

一,关于Python的介绍 关于Python的介绍,我不想多说了,网上随便一搜,很多介绍,这里我主要写下我的自学Python的 过程,也是为了促进我能继续学习下去. 二,环境搭建 1,这里我只讲解Windows,因为我比较喜欢Linux,但是windows 还是必须要用的,所以对linux不是经常用(我不是职业程序猿,只是个业余爱好者),不过这都是很简单的,不论哪个平台,都无所谓了 2,下载Python ,https://www.python.org/downloads/windows/ 选择你

python自学笔记(一)

我没学过python,通过网上和一些图书资料,自学并且记下笔记. 很多细节留作以后自己做项目时再研究,这样能更高效一些. python基础自学笔记 一.基本输入和输出 pthon3.0用input提示用户输入,用print提示用户输出,格式为print("...") 如果格式化输出,那么格式为print("%d" %(变量名)), %d可以替换为%s等其他格式符, 以后用到什么格式自己查,这样学起来高效. 简单的例子: #-*-coding:utf-8-*- nam

Python自学之乐-多继承顺序问题

最近自学Python到面向对象这里,感觉有必要把多继承这里好好理解一下,下面是我自己的一点小总结,如果有朋友觉得有什么不足的,还望不吝赐教! 1.#Author:clark class Animal(object):#动物类 #kind = "" def __init__(self,name,age,food): self.Name = name self.Age = age self.food = food def eat(self): print("%s is eat %