rest-framework框架基本组件

一、快速实例

Quickstart

http://www.cnblogs.com/yuanchenqi/articles/8719520.html

二、序列化

1、准备模型和路由

from django.db import models
# Create your models here.

class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.IntegerField()
    pub_date = models.DateField()
    publish = models.ForeignKey("Publish", on_delete=models.CASCADE)
    authors = models.ManyToManyField("Author")

    def __str__(self):
        return self.title

class Publish(models.Model):
    name = models.CharField(max_length=32)
    email = models.EmailField()

    def __str__(self):
        return self.name

class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()

    def __str__(self):
        return self.name

models.py

  urls.py:

from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    path(‘admin/‘, admin.site.urls),
    path(‘publishes/‘, views.PublishView.as_view())
]

2、序列化方式一:将QuerySet对象转化为数组套字典

from django.shortcuts import render, HttpResponse
from django.views import View
from .models import Publish
import json

class PublishView(View):
    def get(self, request):
        # QuerySet对象不能进行json序列化
        # 方式1:values(*field):调用者是queryset对象,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
        #       再使用list()方法强转为列表,组成列表里面放字典的数据结构
        publish_list = list(Publish.objects.all().values("name", "email"))

        return HttpResponse(json.dumps(publish_list))

    def post(self, request):
        pass

  注意:

(1)values(*field):

  调用者是queryset对象,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列:

  <QuerySet [{‘name‘: ‘橘子出版社‘, ‘email‘: ‘[email protected]‘}, {‘name‘: ‘苹果出版社‘, ‘email‘: ‘[email protected]‘}]>

(2)list():

  将序列强行转化为数组:

  [{‘name‘: ‘橘子出版社‘, ‘email‘: ‘[email protected]‘}, {‘name‘: ‘苹果出版社‘, ‘email‘: ‘[email protected]‘}]

(3)json.dumps():

  json.dumps 用于将 Python 对象编码成 JSON 字符串。以下是python 原始类型向 json 类型的转化对照表:

  

3、序列化方式二:model_to_dict(obj)

(1)循环QuerySet构建可序列化数据结构

from django.views import View
from .models import Publish
import json

class PublishView(View):
    def get(self, request):
        # QuerySet对象不能进行json序列化
        # 方式2:
        publish_list = Publish.objects.all()
        temp = []
        for obj in publish_list:
            temp.append({
                "name": obj.name,
                "name": obj.email
            })
        print(temp)  # [{‘name‘: ‘[email protected]‘}, {‘name‘: ‘[email protected]‘}]

        return HttpResponse(json.dumps(temp))

    def post(self, request):
        pass

  这样写的问题是有多少字段就要加多少个字段,而且如果不知道是哪张表或者有哪些字段,就无法构建数据。

(2)引入model_to_dict完成改写

  model_to_dict是用于将model对象转换为字典的方法。

from django.views import View
from .models import Publish
import json

class PublishView(View):
    def get(self, request):
        # QuerySet对象不能进行json序列化
        # 方式2:
        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))
        print(temp)  # [{‘name‘: ‘[email protected]‘}, {‘name‘: ‘[email protected]‘}]

        return HttpResponse(json.dumps(temp))

(3)测试理解model_to_dict方法

  在pycharm的python console测试:

>>>from django.forms.models import model_to_dict
>>>from app01 import models
>>>print(models)
<module ‘app01.models‘ from ‘/Users/hqs/PycharmProjects/restDemo/app01/models.py‘>
>>>obj = models.Publish.objects.all()
>>>print(obj)
<QuerySet [<Publish: 橘子出版社>, <Publish: 苹果出版社>]>
>>>obj = models.Publish.objects.filter(pk=2).first()
>>>obj  # obj是一个model对象
<Publish: 橘子出版社>

>>>model_to_dict(obj)
{‘id‘: 2, ‘name‘: ‘橘子出版社‘, ‘email‘: ‘[email protected]‘}

  由此可见有几个字段就转化为几个键值对的字典。

4、序列化方式三:serializers.serizlize("json",publish_list)

  serializers是django的序列化组件。

from django.views import View
from .models import Publish
import json

class PublishView(View):
    def get(self, request):
        # QuerySet对象不能进行json序列化
        # 方式3:
        from django.core import serializers
        publish_list = Publish.objects.all()
        ret = serializers.serialize("json", publish_list)

        return HttpResponse(json.dumps(ret))

    def post(self, request):
        pass

  注意:

(1)__init__.py中serialize函数原型

def serialize(format, queryset, **options):
    """
    Serialize a queryset (or any iterator that returns database objects) using
    a certain serializer.
    """
    s = get_serializer(format)()
    s.serialize(queryset, **options)
    return s.getvalue()

  传递给 serialize 方法的参数有二:一个序列化目标格式,另外一个是序列化的对象QuerySet. (事实上,第二个参数可以是任何可迭代的Django Model实例,但它很多情况下就是一个QuerySet).

(2)序列化后数据组织形式

"[{\"model\": \"app01.publish\", \"pk\": 2, \"fields\": {\"name\": \"\\u6a58\\u5b50\\u51fa\\u7248\\u793e\", \"email\": \"[email protected]\"}}, {\"model\": \"app01.publish\", \"pk\": 3, \"fields\": {\"name\": \"\\u82f9\\u679c\\u51fa\\u7248\\u793e\", \"email\": \"[email protected]\"}}]"

5、序列化方式四:(推荐)rest_framework  serializers

from django.views import View
from .models import Publish
import json
from rest_framework import serializers

class PublishSerializers(serializers.Serializer):
    """为QuerySet做序列化"""
    name = serializers.CharField()
    email = serializers.CharField()

class PublishView(View):
    def get(self, request):
        # 方式4:
        publish_list = Publish.objects.all()
        ret = PublishSerializers(publish_list, many=True)  # 描述是model对象还是QuerySet  True:queryset
        return HttpResponse(json.dumps(ret))

    def post(self, request):
        pass

  注意:

(1)分析继承了Serializers的子类PublishSerializers

>>>from app01.views import PublishSerializers
>>>publish_list = models.Publish.objects.all()
>>>PublishSerializers(publish_list, many=True)   # 描述是model对象还是QuerySet
PublishSerializers(<QuerySet [<Publish: 橘子出版社>, <Publish: 苹果出版社>]>, many=True):
    name = CharField()
    email = CharField()
>>>ps = PublishSerializers(publish_list, many=True)
>>>ps.data
[OrderedDict([(‘name‘, ‘橘子出版社‘), (‘email‘, ‘[email protected]‘)]), OrderedDict([(‘name‘, ‘苹果出版社‘), (‘email‘, ‘[email protected]‘)])]

(2)Serializer是对QuerySet和model对象做序列化的

  在序列化时,第一个参数传递要序列化的对象,第二个参数many是向组件声明到底是model对象还是QuerySet。

  many=True:QuerySet      many=False:model对象

三、rest_framework(APIView)

原文地址:https://www.cnblogs.com/xiugeng/p/9572089.html

时间: 2024-08-30 17:04:37

rest-framework框架基本组件的相关文章

工作流,WEB框架,UI组件网络收集整理

工作流,WEB框架,UI组件网络收集整理 在博客园上逛了好多年,随手收录了一些工作流,WEB开发框架,UI组件,现在整理一下与大家分享. 由于个人能力与精力有限,望各位园友在评论中补充,我将全部整理到正文: ? 工作流篇 RoadFlow工作流(收费):                  http://www.cqroad.cn/WorkFlow 驰骋工作流引擎 ccflow                       https://www.oschina.net/p/ccflow YbSof

zend framework框架学习走起——从零开始,点击记录-安装

zend framework第一步,先来安装下zend framework框架. 先介绍下,我这边的php配置环境,为图省事,我是安装wampserver来搭载php环境的,,php+Apache+mysql一下子全部搞定.所以我们的zendframwok框架安装所在文件夹就是在wampserver的www文件夹下. 我们要先去下载下来zend framework框架. 进入zend framework官网,你可以直接下载zend framework框架,也可以和我一样,选择composer方式

net.sz.framework 框架 轻松搭建数据服务中心----读写分离数据一致性,滑动缓存

前言 前文讲述了net.sz.framework 框架的基础实现功能,本文主讲 net.sz.framework.db 和 net.sz.framework.szthread; net.sz.framework.db 是 net.sz.framework 底层框架下的orm框架,仿照翻译了hibernate实现功能,虽然不足hibernate强大:但在于其功能实现单一高效和高可控性: net.sz.framework.szthread 是 net.sz.framework 底层框架下的线程控制中

在zend framework框架中try{}catch(Exception e){}的跳转问题

请勿盗版,转载请加上出处http://blog.csdn.net/yanlintao1 首先我先说明我遇到的问题 try{ //导入学生信息 $ModelStudent->insert($data2); } catch (Exception $e) { unlink(DOCS_PATH.'/student.xls'); $this->view->str = '导入失败,请检查数据格是否正确!'; $this->_forward("error","glo

Git.Framework 框架随手记--ORM项目工程

前面已经简单介绍过了该框架(不一定是框架),本文开始重点记录其使用过程.可能记录的内容不是太详尽,框架也可能非常烂,但是里面的代码句句是实战项目所得.本文非教唆之类的文章,也非批判之类的文章,更不是炫技之类的文章,只是工作的记录和总结,希望能够给大家一些启迪,忘诸位勿喷! 一. 组建项目需要的几个部分 .NET中最为经典的三层结构,众所周知,无人不晓. 在Git.Framework框架中我们也遵循最基本的这种结构,ORM部分我们划分为如下: 数据实体层,数据访问接口层,数据访问层,[层序主入口加

利用AddressBook.framework框架获取iOS系统通讯录数据

此方法是使用AddressBook.framework框架获取通讯录信息 第一步.在info.plist文件里面配置访问权限 第二步.导入头文件 1 #import <AddressBook/AddressBook.h> 2 #import <AddressBookUI/AddressBookUI.h> 第三步.获取通讯录数据 1 - (void)getSystemAddress{ 2 3 //新建一个通讯录类 4 ABAddressBookRef addressBooks = n

Framework 框架安装 学习篇(二)

一.Framework版本(1.0)(1.1)(2.0)(3.0)(3.5)(4.0)(4.5) FrameWork框架可以从微软官方网站下载免费的框架进行安装. 下载地址:http://rj.baidu.com/soft/detail/22370.html?ald (版本:4.5) 二.配置框架环境变量 1.右键点击“我的电脑”,选择“属性”,点击右侧的“高级系统设置”,弹出对话框,选择“环境变量”. 2.在系统变量中选择变量名“Path”进行编辑,在变量值最后加上FrameWork路径(切记

Hush Framework框架配置(续) 转自《Android和PHP最佳实践》官方站

图书资源下载 Xampp 开发环境下载:http://pan.baidu.com/share/link?shareid=531771&uk=773037279 微博实例完整源码包下载:http://pan.baidu.com/share/link?shareid=531769&uk=773037279 Hush Framework 框架源码及相关资源下载:http://code.google.com/p/hush-framework/downloads/list 其他 Android 客户

net.sz.framework 框架 轻松搭建服务---让你更专注逻辑功能---初探

前言 在之前的文章中,讲解过 threadmodel,socket tcp ,socket http,log,astart ,scripts: 都是分片讲解,从今天开始,将带大家,一窥 net.sz.framework 框架: net.sz.framework 框架分为java版本和C#.net 版本,两种语言版本保持高一致性: net.sz.framework 能做什么呢? net.sz.framework 是经过多年实践和研究,包括在线项目验证的底层框架,致力于解决框架问题: 让你更轻松,愉

Hush Framework框架配置(转)

在写这篇文章的时候,楼主已经饿的不行了,因为我从3点开始就在折腾Hush Framework,走了很多弯路,打铁要趁热,先把基本的过程记录下来,留待以后翻阅,同时记录其中容易走弯路的地方,特别是对于一个像我这样的newer,搞起来真的是巨折腾人的. 既然写到要配置Hush Framework框架,那么对于它的理解,我在这里就不再多说,总之,是一个建立在Smarty和Zend Framework的PHP开发框架,综合了两者的有点,摒弃了Zend Framework的笨重. 首先得学会在apache