一、快速实例
http://www.django-rest-framework.org/tutorial/quickstart/#quickstart
http://www.cnblogs.com/yuanchenqi/articles/8719520.html
简介:
restframework(Django) app
pip install django
pip install djangorestframework
(前后端分离 后端返回 json 数据)
----针对数据:json
---- 一切皆是资源,操作只是请求方式
----book表增删改查
/books/ books
/books/add/ addbook
/books/(\d+)/change/ changebook
/books/(\d+)/delete/ delbook
----book表增删改查 url里面不能出现动词!!
/books/ -----get books ----- 返回当前所有数据
/books/ -----post books ----- 返回提交数据
/books/(\d+)-----get bookdetail ----- 返回当前查看的单条数据
/books/(\d+)-----put bookdetail ----- 返回更新数据
/books/(\d+)-----delete bookdetail ----- 返回空
应用:
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^book/', views.Book.as_view()), url(r'^bookdetail/(\d+)', views.BookDetail.as_view()), ] --------------------------------------------------------------- from django.shortcuts import render,redirect,HttpResponse # Create your views here. from django.views import View class Book(View): def get(self,request): return HttpResponse("get all...") # 查看所有书籍 def post(self,request): return HttpResponse("post all...") # 添加书籍 class BookDetail(View): def get(self,request,pk): return HttpResponse("get ..."+ pk) # 查看某本书籍 def put(self,request,pk): return HttpResponse("put ..." + pk) # 查看某本书籍 def post(self,request,pk): return HttpResponse("post ..." + pk) # 添加某本书籍 def delete(self,request,pk): return HttpResponse("delete ..." + pk) # 删除某本书籍
二、序列化
url(r"^publishes/", views.PublishView.as_view())
方式一 list()
class PublishView(View): def get(self,request): # 方式一: publish_list = list(Publish.objects.all().values("name","email")) # {'name': '苹果出版社', 'email': '123@qq.com'}{'name': '橘子出版社', 'email': '456@qq.com'} return HttpResponse(publish_list)
方式二 model_to_dict(obj)
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({ # "name":obj.name, # "email":obj.email # }) temp.append(model_to_dict(obj)) print(temp, type(temp)) # [{'name': '苹果出版社', 'email': '123@qq.com'}, {'name': '橘子出版社', 'email': '456@qq.com'}] <class 'list'> # [{'id': 1, 'name': '苹果出版社', 'email': '123@qq.com'}, {'id': 2, 'name': '橘子出版社', 'email': '456@qq.com'}] <class 'list'> return HttpResponse(temp)
方式三 serializers.serialize("json",publish_list)
class PublishView(View): def get(self,request): # 方式三 from django.core import serializers publish_list = Publish.objects.all() ret = serializers.serialize("json",publish_list) """ [ { "model": "app01.publish", "pk": 1, "fields": { "name": "苹果出版社", "email": "123@qq.com" } }, { "model": "app01.publish", "pk": 2, "fields": { "name": "橘子出版社", "email": "456@qq.com" } } ] """ return HttpResponse(ret)
方式四(推荐)(rest_framework serializers)
序列化一个queryset: PublishSerializers(publish_list, many=True)
序列化一个对象: PublishSerializers(model_obj)
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() ret = PublishSerializers(publish_list, many=True) # queryset # print(ret.data) # print(type(ret.data)) # [OrderedDict([('name', '苹果出版社'), ('email', '123@qq.com')]), # OrderedDict([('name', '橘子出版社'), ('email', '456@qq.com')])] # <class 'rest_framework.utils.serializer_helpers.ReturnList'> """ >>>dict([("name","橘子出版社"),("email","456@qq.com")]) {'name': '橘子出版社', 'email': '456@qq.com'} """ return HttpResponse(ret.data)
三、rest_framework (APIView)
models.py
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") authors = models.ManyToManyField("Author") 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
取数据
get:
request._request ( 原request )
request.GET == request._request.GET
post:
request.data ( 得到 json 数据,也可得到 urlencode 数据)
都是 rest_framework APIView 的功劳,
如果使用 View , request.post( 只能得到 urlencode 的数据,不能得到 json 数据,只能从 request.body 中取)
from django.shortcuts import render,redirect,HttpResponse from django.views import View from .models import * from rest_framework.views import APIView, Response from rest_framework import serializers class PublishSerializers(serializers.Serializer): name = serializers.CharField() email = serializers.EmailField() class PublishView(APIView): def get(self,request): # 取数据 APIView publish_obj = Publish.objects.all() ret = PublishSerializers(publish_obj,many=True) print(ret.data) # [OrderedDict([('name', '苹果出版社'), ('email', '123@qq.com')]), # OrderedDict([('name', '橘子出版社'), ('email', '456@qq.com')])] print(request.GET) # <QueryDict: {'a': ['1'], 'b': ['2']}> print("data",request.data) # # 只处理 post print(request._request.GET) # <QueryDict: {'a': ['1'], 'b': ['2']}> return HttpResponse(ret.data) # return Response(ret.data) def post(self,request): # 取数据 View (原生request支持得操作) # print("post",request.POST) # <QueryDict: {'a': ['1'], 'b': ['2']}> # print("body",request.body) # b'a=1&b=2' # 发的是json数据 View (不处理json数据,只解析urlencode) (原生request支持得操作) # print("post", request.POST) # <QueryDict: {}> # print("body", request.body) # b'{"name":"yuan","age":12}' # print(type(request)) # <class 'django.core.handlers.wsgi.WSGIRequest'> # from django.core.handlers.wsgi import WSGIRequest # APIView (新得request支持得操作) print(type(request)) # <class 'rest_framework.request.Request'> from rest_framework.request import Request print(request._request) # <WSGIRequest: POST '/publishes/'> print("data",request.data) # {'name': 'yuan', 'age': 12} print("type",type(request.data)) # <class 'dict'> return HttpResponse('POST')
四、rest_framework (Response)
""" 响应器
针对 不同得访问者 浏览器 postman 做不同得处理
只有浏览器,用户 会给一个页面!!
几种请求方式
get post
get put delete
"""
Response:
配置之后:浏览器才可访问; rest_framework 是django的一个app!
可发 get / post 请求 !!
postman: 可模拟浏览器发送
get post put delete ...
from .models import * from rest_framework.views import APIView, Response from rest_framework import serializers class PublishSerializers(serializers.Serializer): name = serializers.CharField() email = serializers.EmailField() class PublishView(APIView): def get(self,request): publish_obj = Publish.objects.all() # model_obj = Publish.objects.all().first() ret = PublishSerializers(publish_obj,many=True) # queryset # ret = PublishSerializers(model_obj) # obj return Response(ret.data) def post(self,request): print("data",request.data) # {'name': 'yuan', 'age': 12} return Response(request.data)
五、rest_framework (serializers.Serializer)
一对多:
publish = serializers.CharField() # str(obj) publish = serializers.CharField(source='publish.email')
多对多:
# authors = serializers.CharField(source="authors.all") authors = serializers.SerializerMethodField() def get_authors(self,book_obj): temp = [] for obj in book_obj.authors.all(): temp.append(obj.name) return temp
from .models import * from rest_framework.views import APIView, Response from rest_framework import serializers class BookSerializers(serializers.Serializer): title = serializers.CharField(max_length=32) price = serializers.IntegerField() pub_date = serializers.DateField() publish = serializers.CharField(source='publish.email') # authors = serializers.CharField(source="authors.all") authors = serializers.SerializerMethodField() def get_authors(self,book_obj): temp = [] for obj in book_obj.authors.all(): temp.append(obj.name) return temp class BookView(APIView): def get(self, request): book_list = Book.objects.all() ret = BookSerializers(book_list,many=True) return Response(ret.data) def post(self, request): pass """ 序列化的过程: BookSerializers(book_list,many=True) temp = [] for obj in book_list: "title":obj.title, "price":obj.price, "pub_date":obj.pub_date, "publish":str(obj.publish), #"authors":obj.authors.all, "authors":get_authors(obj) """ class PublishSerializers(serializers.Serializer): name = serializers.CharField() email = serializers.EmailField() class PublishView(APIView): def get(self,request): publish_obj = Publish.objects.all() # model_obj = Publish.objects.all().first() ret = PublishSerializers(publish_obj,many=True) # ret = PublishSerializers(model_obj) return Response(ret.data) def post(self,request): print("data",request.data) # {'name': 'yuan', 'age': 12} return Response(request.data) ----------------------------------------- from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r"^publishes/", views.PublishView.as_view()), url(r"^books/", views.BookView.as_view()) ]
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") 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