二 .Django---framework框架 配置和序列化

一.配置参数使用

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\r\user_agent:Google\r\ncontentType:urlencoded\r\n\r\n" "POST url http/1.1\r\user_agent:Google\r\ncontentType:urlencoded\r\n\r\na=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"),

 

posted @ 2019-10-10 03:33  supreme999  阅读(208)  评论(0)    收藏  举报