首页 > 其他 > 详细

DjangoRestFramework

时间:2019-11-05 21:58:06      阅读:271      评论:0      收藏:0      [点我收藏+]

一.restful规范

在之前的代码习惯中,通常使用一个url对应一个视图函数,现在有了restful规范,就要遵循。简单来说,就是多个url对应一个视图,视图中封装了get,post,put,patch,delete等主要方法。相对于FBV来说更加简单,使用了CBV模式。

get,获取数据
post,添加
put,更新
patch 局部更新
delete,删除

二.初始drf

注册app

INSTALLED_APPS = [
    django.contrib.admin,
    django.contrib.auth,
    django.contrib.contenttypes,
    django.contrib.sessions,
    django.contrib.messages,
    django.contrib.staticfiles,
    rest_framework
]

服务端会根据访问者使用工具的不同来区分,如果不添加rest_framework,使用postman等工具访问是没有问题的,但是使用浏览器访问会报错,因为会默认找到rest_framework下的静态html文件进行渲染,此时找不到,因此报错。

使用

路由

from django.conf.urls import url
from django.contrib import admin
from api import views

urlpatterns = [
    url(r^drf/info/, views.DrfInfoView.as_view()),
]

视图

from rest_framework.views import APIView
from rest_framework.response import Response

class DrfInfoView(APIView):

    def get(self,request,*args,**kwargs):
        data = {"":""}
        return Response(data)

使用工具postman模拟前端发送请求

下面前端通过不同方式请求,后端request.body和request.POST得到的数据,本质上是POST根据body得到的数据来做出相应的改变

默认使用x-www-urlencoded方式

request.body: name=alex&age=19&gender=12
request.POST: {name: [alex], age: [19], gender: [12]}

json方式

request.body: b{"ID":1,"name":"Alex","age":19}
request.POST: 没有值

可以看到,通过json发送给后端数据时,request.POST是无法得到数据的,因此,在使用drf时,统一使用request.data

接口进阶

自定义序列化

路由

from django.conf.urls import url
from django.contrib import admin
from api import views
urlpatterns = [
    url(r^drf/category/$, views.DrfCategoryView.as_view()),  #get/post通过此url
    url(r^drf/category/(?P<pk>\d+)/$, views.DrfCategoryView.as_view()), #put/patch/delete通过此url
]

视图

from api import models
from django.forms.models import model_to_dict   #序列化,将model转为dict类型
class DrfCategoryView(APIView):
    def get(self,request,*args,**kwargs):
        """获取所有文章分类/单个文章分类"""
        pk = kwargs.get(pk)
        if not pk:
            queryset = models.Category.objects.all().values(id,name)
            data_list = list(queryset)
            return Response(data_list)
        else:
            category_object = models.Category.objects.filter(id=pk).first()
            data = model_to_dict(category_object)
            return Response(data)
     def post(self,request,*args,**kwargs):
        """增加一条分类信息"""
        models.Category.objects.create(**request.data)
        return Response(成功)

三.drf序列化

这里使用到了serializers,和modelform使用方法相似。如果要序列化(将model转为json对象)就使用instance=queryset,反之,data参数写为data=request.data

路由

from django.conf.urls import url
from django.contrib import admin
from api import views
urlpatterns = [
    url(r^new/category/$, views.NewCategoryView.as_view()),
    url(r^new/category/(?P<pk>\d+)/$, views.NewCategoryView.as_view()),
]

视图

class NewCategoryView(APIView):
    def get(self,request,*args,**kwargs):
        pk = kwargs.get(pk)
        if not pk:
            queryset = models.Category.objects.all()
            ser = NewCategorySerializer(instance=queryset,many=True)   #many=True显示多条数据
            return Response(ser.data)
        else:
            model_object = models.Category.objects.filter(id=pk)
            ser = NewCategorySerializer(instance=model_object, many=False)  #many=False显示单条数据
            return Response(ser.data)

    def post(self,request,*args,**kwargs):
        ser = NewCategorySerializer(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        return Response(ser.errors)

    def put(self,request,*args,**kwargs):
        pk = kwargs.get(pk)
        category_object = models.Category.objects.filter(id=pk).first()
        ser = NewCategorySerializer(instance=category_object,data=request.data)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        return Response(ser.errors)

    def delete(self,request,*args,**kwargs):
        pk = kwargs.get(pk)
        models.Category.objects.filter(id=pk).delete()
        return Response(删除成功)

要跨表查看其他表中的字段,或者

 

 

DjangoRestFramework

原文:https://www.cnblogs.com/gaoyukun/p/11801822.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!