通过django的rest-framework……(CBV)
为什么不使用FBV,因为CBV重用性很高
先看一个例子:
from django.views.generic.base import View
from django.http import HttpResponse, JsonResponse
from goods.models import Goods
import json
# from django.views.generic import ListView class GoodsListView(View):
def get(self, request):
"""
通过django的view实现商品列表页
:param request:
:return:
"""
json_list = []
goods = Goods.objects.all()[:10]
for good in goods:
json_dict = {}
json_dict["name"] = good.name
json_dict["category"] = good.category.name
json_dict["market_price"] = good.market_price
json_dict["add_time"] = good.add_time
json_list.append(json_dict)
return HttpResponse(json.dumps(json_list), content_type='application/json') # 使用HTTPResponse返回json数据,必须指定content_type
通过上面我们可以看到的是先从django中引入View类,之后通过json的方式返回。这似乎没有问题,只要去掉add_time
如果json序列化中有时间类型的话,JSON就会失败,运行就会报错:

去掉之后返回也必须指定content_type=‘application/json’。而且不好的地方还有比如写那么多字段容易写错等
那如何解决呢?
from django.forms.models import model_to_dict # django提供的方法将所有字段变成一个dict
for good in goods:
json_dict = model_to_dict(good)
json_list.append(json_dict)
但是图片啊时间类型都没办法序列化?那该如何?
from django.core import serializers
django提供的这个模块是专门用来实现序列化的
import json
from django.core import serializers
json_data = serializers.serialize('json', goods) # 这个直接传入questset
json_data = json.loads(json_data)
from django.http import HttpResponse, JsonResponse
return JsonResponse(json_data, safe=False)
通过这个代码可以完成上面所有的工作。①取到所有字段②可以序列化所有③不用一个一个写
整体如下:
from django.views.generic.base import View from goods.models import Goods
# from django.views.generic import ListView class GoodsListView(View):
def get(self, request):
"""
通过django的view实现商品列表页
:param request:
:return:
"""
json_list = []
goods = Goods.objects.all()[:10]
# for good in goods:
# json_dict = {}
# json_dict["name"] = good.name
# json_dict["category"] = good.category.name
# json_dict["market_price"] = good.market_price
# json_dict["add_time"] = good.add_time
# json_list.append(json_dict) from django.forms.models import model_to_dict # django提供的方法将所有字段变成一个dict
for good in goods:
json_dict = model_to_dict(good)
json_list.append(json_dict) import json
from django.core import serializers
json_data = serializers.serialize('json', goods) # 这个直接传入questset
json_data = json.loads(json_data)
from django.http import HttpResponse, JsonResponse
return JsonResponse(json_data, safe=False)
django-rest-framework名称太长了,下面检查drf
首先是安装
官方文档中的安装
值得注意的是要想drf生成文档,必须在django的url配置

from rest_framework.documentation import include_docs_urls
urlpatterns = [
url(r'docs/', include_docs_urls(title="文档")),]
注意,千万不要在docs后面加上$,名称可以随意命名!
然后将rest-framework配置到settings中
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'users.apps.UsersConfig',
'DjangoUeditor',
'goods.apps.GoodsConfig',
'trade.apps.TradeConfig',
'user_operation.apps.UserOperationConfig',
'crispy_forms',
'django_filters',
'xadmin',
'rest_framework', # 一定要配置,不然会报错
'corsheaders',
'rest_framework.authtoken'
]
在一步一步跟着官方文档进行

这个在后期调试API的时候会用到的
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
在这边给他加了一个命名空间,方便反向查询。
看一个例子:
1,首先像Form组件一样新建一个py文件

# -*- coding:UTF-8 -*-
__autor__ = 'zhouli'
__date__ = '2018/12/6 23:19' from rest_framework import serializers class GoodsSerializer(serializers.Serializer): # 针对Goods的字段,类似Form组件,类名规则为models表名+Serializer
name = serializers.CharField(required=True, max_length=100) # 是否必须
click_num = serializers.IntegerField(default=0)
因为Goods表中字段过多,因此只去两个做示范
是不是和Form组件非常像!
但需要注意的是:
1,类的命名必须是models中写的表名+Serializer
2,对于字段的调用可以随意安排,不必要全部写入(当然展示的也仅仅是这两个字段)
第二步:

from .serializers import GoodsSerializer
from .models import Goods
from rest_framework.views import APIView
from rest_framework.response import Response
class GoodsViews(APIView):
def get(self, request, format=None):
goods = Goods.objects.all()[:10]
goods_json = GoodsSerializer(goods, many=True) # 如果goods只是单个queryset的话,便可不必加many=True
return Response(goods_json.data) # 参数data就是完成之后的存储地方
在django的视图函数中写入判断逻辑,注意点:
1,如果从数据库中取到只是单个queryset的话,便可不必加many=True
2,通过Serializer中的data可以获取到处理之后的Json内容
然后自己配置url便可实现简单的访问

通过django的rest-framework……(CBV)的更多相关文章
- Django之REST framework源码分析
前言: Django REST framework,是1个基于Django搭建 REST风格API的框架: 1.什么是API呢? API就是访问即可获取数据的url地址,下面是一个最简单的 Djang ...
- django的rest framework框架——安装及基本使用
一.django的FBV 和 CBV 1.FBV(基于函数的视图): urlpatterns = [ url(r'^users/', views.users), ] def users(request ...
- Django’s cache framework
小结: 1.缓存存储位置:数据库.文件系统.内存 2.通过缓存前缀实现跨服务器缓存 Django’s cache framework | Django documentation | Django h ...
- Python学习---django知识补充之CBV
Django知识补充之CBV Django: url --> def函数 FBV[function based view] 用函数和URL进行匹配 url --> ...
- Django 反向解析 request CBV
正则路径中的分组 无名分组 分组的概念:就是给某一段正则表达式用小括号括起来 无名分组按位置传参数,一一对应. view中除去request,其他形参数量要与urls中分组数量一致. 无名分组就是将括 ...
- Django基础七之CBV装饰器和中间件
Django基础七之CBV装饰器和中间件 目录 Django基础七之CBV装饰器和中间件 1. CBV加装饰器 2. Django中间件 2.1 Django中间件介绍 2.2 自定义中间件 2.2. ...
- Django之Rest Framework框架
一.什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度 ...
- django的FBV和CBV
title: python djano CBV FBV tags: python, djano, CBV, FBV grammar_cjkRuby: true --- python django的fu ...
- Django生命周期 URL ----> CBV 源码解析-------------- 及rest_framework APIView 源码流程解析
一.一个请求来到Django 的生命周期 FBV 不讨论 CBV: 请求被代理转发到uwsgi: 开始Django的流程: 首先经过中间件process_request (session等) 然后 ...
- django基于restframework的CBV封装
一.models数据库映射 from django.db import models # Create your models here. class Book(models.Model): titl ...
随机推荐
- python------Socket网络编程(二)粘包问题
一.socket网络编程 粘包:服务端两次发送指令在一起,它会把两次发送内容合在一起发送,称为粘包,从而出现错误. 解决方法:(比较low的方法) 有些需要实时更新的,用sleep有延迟,不能这样解决 ...
- python __name__ 和__main__的使用领悟
__name__和__main__的使用 #hello.pydef sayHello(): str="hello" print(str); if __name__ == " ...
- SharpDevelope 在 Windows 7 SP1 with .net framework4.0 下编译时找不到resgen.exe 解决办法
如果在vs下编译正常,在SharpDevelope下编译报这个错误,可以更改编译时的.netframework版本和C#版本.在 Tool->Project Upgrade 进行项目转换后,一般 ...
- 策略模式(Strategy )
为实现一个目的采用不同的方式都可实现,具体看要采取哪种方式. //接口 public interface Strategy { public void algorithmInterface(); ...
- Hi3516EV100烧录出厂固件
1.Hitool烧录uboot 2.uboot下烧录固件 setenv serverip 192.168.1.138 mw.b ff ;tftp ;sf probe ;sf erase ;sf wri ...
- nodeppt:网页版 PPT
资料 网址 github https://github.com/ksky521/nodeppt 网页版PPT(nodeppt 的介绍) http://deliazhi.com/2017/03/31/W ...
- react-native 获取组件的宽度和高度
react-native 获取组件的尺寸有两种方式,第一种方式使用元素自身的onLayout属性去获取,但是这种方式有一个局限性,就是只有在初次渲染的时候才会触发这个函数,而且此种方法获取的是组件相对 ...
- Windows下,python pip安装时ReadTimeoutError解决办法
一般情况下PIP出现ReadTimeoutError都是因为被GFW给墙了,所以一般遇到这种问题,我们可以选择国内的镜像来解决问题. 在Windows下: C:\Users\Administrator ...
- 4、Zookeeper简单介绍
一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术——分布式协调技术.那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术 主要用来解决分布式环境当中多个进程之间的 ...
- 使用睿云智合开源 Breeze 工具部署 Kubernetes v1.12.3 高可用集群
一.Breeze简介 Breeze 项目是深圳睿云智合所开源的Kubernetes 图形化部署工具,大大简化了Kubernetes 部署的步骤,其最大亮点在于支持全离线环境的部署,且不需要FQ获取 G ...