一.配置参数使用
https://www.cnblogs.com/pythonywy/p/11448868.html
二. 序列化
# 注册drf app NSTALLED_APPS = [ # ... 'rest_framework', ]
https://www.cnblogs.com/heshun/p/10158695.html DRF - 序列化组件(GET/PUT/DELETE接口设计)、视图优化组件
https://www.cnblogs.com/yuanchenqi/articles/8719520.html 序列化
开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式。
我们可以通过声明与Django forms非常相似的序列化器
(serializers)来实现。
models部分:
分析源码等
(1)Django的原生request: 浏览器 ------------- 服务器 "GET url?a=1&b=2 http/1.1 user_agent:Google contentType:urlencoded " "POST url http/1.1 user_agent:Google contentType:urlencoded a=1&b=2" request.body: a=1&b=2 request.POST: if contentType:urlencoded: a=1&b=2----->{"a":1,"b":2} (2)restframework 下的APIView: (3) class PublishSerializers(serializers.Serializer): name=serializers.CharField() email=serializers.CharField() PublishSerializers(queryset,many=true) PublishSerializers(model_obj) 总结: 1 reuqest类----源码 2 restframework 下的APIView--源码 url(r'^books/$', views.BookView.as_view(),name="books")# View下的view books/一旦被访问: view(request) ------APIView: dispatch() 3 def dispatch(): 构建request对象 self.request=Request(request) self.request._request self.request.GET # get self.request.data # POST PUT 分发----if get请求: if request.method.lower() in self.http_method_names: handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed response = handler(request, *args, **kwargs) # self.get(request, *args, **kwargs) return response 4 序列化类 # from django.core import serializers # ret=serializers.serialize("json",publish_list) restframework下的序列类 BookModelSerializers 将queryset或者model对象序列成一json数据 bs=BookModelSerializers(book_list,many=True,context={'request': request}) bs=BookModelSerializers(book,context={'request': request}) 还可以做校验数据,json-------》queryset/model-->记录 bs=BookModelSerializers(data=request.data) if bs.is_valid(): print(bs.validated_data) bs.save() # 重写create方法 5 操作数据: 以Book表为例 class BookView(APIView): # 查看所有书籍 def get(self,request): book_list=Book.objects.all() bs=BookModelSerializers(book_list,many=True,context={'request': request}) return Response(bs.data) # 添加一本书籍 def post(self,request): # post请求的数据 bs=BookModelSerializers(data=request.data) if bs.is_valid(): print(bs.validated_data) bs.save()# create方法 return Response(bs.data) else: return Response(bs.errors) class BookDetailView(APIView): # 查看一本书籍 def get(self,request,id): book=Book.objects.filter(pk=id).first() bs=BookModelSerializers(book,context={'request': request}) return Response(bs.data) # 更新一本书籍 def put(self,request,id): book=Book.objects.filter(pk=id).first() bs=BookModelSerializers(book,data=request.data) if bs.is_valid(): bs.save() return Response(bs.data) else: return Response(bs.errors) # 删除某一本书籍 def delete(self,request,id): Book.objects.filter(pk=id).delete() return Response()
1. 序列化简单使用
model
# Create your models here. 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(auto_now=True) publish=models.ForeignKey("Publish",on_delete=models.CASCADE) # ForeignKey一对多 authors=models.ManyToManyField("Author") # ManyToManyField 多对多 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
viwes
from django.shortcuts import render,HttpResponse from django.views import View from rest_framework.response import Response from .models import * from rest_framework.views import APIView from rest_framework import serializers import json # 为queryset,mode l对象做序列化 class PublishModelSerializers(serializers.ModelSerializer): class Meta: model=Publish fields="__all__" # 这种 序列化 和 上面序列化相同 只是上面简单 一次性 # class PublishSerializers(serializers.Serializer): # name = serializers.CharField() # email = serializers.CharField() class PublishView(APIView): def get(self,request): # restframework # 取数据 print("request.data", request.data) print("request.data type", type(request.data)) # print(request._request.GET) print(request.GET) publish_list= Publish.objects.all()
# 序列化 # 方式1: # publish_list=list(Publish.objects.all().values("name","email")) # return Response(publish_list)

# 方式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)) # return HttpResponse(temp)

# 方式3: # from django.core import serializers # ret=serializers.serialize("json",publish_list) # return HttpResponse(ret)
# 序列组件 publish_list = Publish.objects.all() ps = PublishModelSerializers(publish_list, many=True) # many表示多个 model对象 queryset多个 return Response(ps.data)
print("########################################################################") def post(self, request): # 取数据 # 原生request支持的操作 print("POST",request.POST) print("body",request.body) # print(request) print(type(request)) from django.core.handlers.wsgi import WSGIRequest # 新的request支持的操作 print("request.data",request.data) print("request.data type",type(request.data)) # post请求的数据 ps = PublishModelSerializers(data=request.data) if ps.is_valid(): print(ps.validated_data) ps.save() # create方法 return Response(ps.data) else: return Response(ps.errors)

GET 打印 request.data {} request.data type <class 'dict'> <QueryDict: {}> 这是============get哈哈哈 PSOST 打印 POST <QueryDict: {}> 这是post-------------哈哈哈 body b'' 原数据 <class 'rest_framework.request.Request'> request.data {} request.data type <class 'dict'>
url url(r'^publishes/$', views.PublishView.as_view(),name="publish"), # View:view(request)=====APIView:dispatch()
2. ModelSerializer(get put del)
retrieve get/id/ update put/id/ destroy delect/id/ list get partial_update patch create post
----book表增删改查
/books/ -----get books ----- 返回当前所有数据
/books/ -----post books ----- 返回提交数据
/books/(d+)-----get bookdetail ----- 返回当前查看的单条数据
/books/(d+)-----put bookdetail ----- 返回更新数据
/books/(d+)-----delete bookdetail ----- 返回空
class Books(View):
def get(self,request):
pass # 查看所有书籍
def post(self,request):
pass # 添加书籍
class BooksDetail(View):
def get(self,request,id):
pass # 查看具体书籍
def put(self,request,id):
pass # 更新某本书籍
def delete(self,request,id):
pass # 删除某本书籍
# Create your models here. 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(auto_now=True) publish=models.ForeignKey("Publish",on_delete=models.CASCADE) # ForeignKey一对多 authors=models.ManyToManyField("Author") # ManyToManyField 多对多 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
from django.shortcuts import render,HttpResponse from django.views import View from rest_framework.response import Response from .models import * from rest_framework.views import APIView from rest_framework import serializers import json def aa(request): return HttpResponse("欢迎啊哈哈哈哈") # 为queryset,mode l对象做序列化 class PublishModelSerializers(serializers.ModelSerializer): class Meta: model=Publish fields="__all__" class PublishDetailView(APIView): def get(self, request, pk): publish = Publish.objects.filter(pk=pk).first() ps = PublishModelSerializers(publish) return Response(ps.data) def put(self, request, pk): publish = Publish.objects.filter(pk=pk).first() ps = PublishModelSerializers(publish, data=request.data) if ps.is_valid(): ps.save() return Response(ps.data) else: return Response(ps.errors) def delete(self, request, pk): Publish.objects.filter(pk=pk).delete() return Response()



url(r'^publishes/(?P<pk>d+)/$', views.PublishDetailView.as_view(),name="detailpublish"), # View:view(request)=====APIView:dispatch()
4. 重写save中的create方法
model 类和上面一样
from django.shortcuts import render,HttpResponse from django.views import View from rest_framework.response import Response from .models import * from rest_framework.views import APIView from rest_framework import serializers import json def aa(request): return HttpResponse("欢迎啊哈哈哈哈") class BookModelSerializers(serializers.ModelSerializer): class Meta: model = Book fields = "__all__" # #publish=serializers.CharField(source="publish.pk") # publish=serializers.HyperlinkedIdentityField( # view_name="detailpublish", # lookup_field="publish_id", # lookup_url_kwarg="pk" # ) class BookView(APIView): def get(self,request): book_list=Book.objects.all() bs=BookModelSerializers(book_list,many=True,context={'request': request}) # many表示多个 model对象 queryset多个 return Response(bs.data) def post(self,request): # post请求的数据 bs=BookModelSerializers(data=request.data) if bs.is_valid(): print(bs.validated_data) bs.save()# create方法 return Response(bs.data) else: return Response(bs.errors)


url(r'^books/$', views.BookView.as_view(), name="books"),
5. 单条数据的get和put请求
model类 和 上面一样
from django.shortcuts import render,HttpResponse from django.views import View from rest_framework.response import Response from .models import * from rest_framework.views import APIView from rest_framework import serializers import json def aa(request): return HttpResponse("欢迎啊哈哈哈哈") class BookModelSerializers(serializers.ModelSerializer): class Meta: model = Book fields = "__all__" class BookDetailView(APIView): def get(self,request,id): book=Book.objects.filter(pk=id).first() bs=BookModelSerializers(book,context={'request': request}) return Response(bs.data) def put(self,request,id): book=Book.objects.filter(pk=id).first() bs=BookModelSerializers(book,data=request.data) if bs.is_valid(): bs.save() return Response(bs.data) else: return Response(bs.errors) def delete(self,request,id): Book.objects.filter(pk=id).delete() return Response()

url(r'^books/(d+)/$', views.BookDetailView.as_view(), name="detailbook"),