- 先看下手动序列化的
# -*- coding: utf-8 -*-
from django.shortcuts import render
# Create your views here.
from django.views import View
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse
from rest_framework.views import APIView
from rest_framework.response import Response
from drf import models
# 传统的CBV
@method_decorator(csrf_exempt, name='dispatch')
class NomalAPI(View):
def get(self, request):
return JsonResponse({'status': True, 'data': "nomal"})
def post(self, request):
pass
# CRF 继承APIView(本质上也是继承了django的view,给类套了一层csrf_exempt())
class CRFAPI(APIView):
def get(self, request):
return Response({'status': True, 'data': "crf"})
def post(self, request):
return Response({'status': True, 'data': "crf-post"})
class DepartView(APIView):
'''
get方法中判断url是否携带id,携带了就获取具体的id下的内容,否则获取全部数据
'''
def get(self, request, *args, **kwargs):
# url中携带的pk是由kwargs传参过来的,而非在request中(request中的是url上?XX=XX的内容)
pk = kwargs.get('pk')
print(f'pk is ----------->{pk}')
if pk:
people = models.Depart.objects.filter(id=pk).values('id', 'title', 'num')
else:
# 查询所有人,手动序列化返回值为字典格式 .values('id', 'title', 'num')
people = models.Depart.objects.all().values('id', 'title', 'num')
return Response(people)
def post(self, request):
pass
- 对于数据库查询结果,rest framework封装了一个方法用于序列化对象,改写上面的代码
from rest_framework import serializers
# 序列化
class DepartSerializers(serializers.ModelSerializer):
class Meta:
model = models.Depart
fields = "__all__"
class DepartView(APIView):
'''
get方法中判断url是否携带id,携带了就获取具体的id下的内容,否则获取全部数据
'''
def get(self, request, *args, **kwargs):
# url中携带的pk是由kwargs传参过来的,而非在request中(request中的是url上?XX=XX的内容)
pk = kwargs.get('pk')
print(f'pk is ----------->{pk}')
if pk:
print('pk获取到了')
# res = models.Depart.objects.filter(id=pk).values('id', 'title', 'num')
res = models.Depart.objects.filter(id=pk).first()
# 实例化序列化类
return_res = DepartSerializers(instance=res, many=False)
else:
# 查询所有人,手动序列化返回值为字典格式 .values('id', 'title', 'num')
# res = models.Depart.objects.all().values('id', 'title', 'num')
res = models.Depart.objects.all()
return_res = DepartSerializers(instance=res, many=True)
return Response(return_res.data)
def post(self, request, *args, **kwargs):
'''新增数据'''
res = DepartSerializers(data=request.data)
# 数据校验功能
if res.is_valid():
new_obj = res.save()
print(f'new_obj is {new_obj}')
return Response(res.data)
else:
print(res.errors)
return Response(res.errors)
def delete(self, request, pk):
'''删除数据,此处必须要有参数PK(避免全量删除数据)'''
models.Depart.objects.filter(id=pk).delete()
return Response('删除成功')
def put(self, request, pk):
'''更新数据(所有字段都要传)'''
modify_obj = models.Depart.objects.filter(id=pk).first()
if not modify_obj:
Response('数据不存在,无法更新')
res = DepartSerializers(instance=modify_obj, data=request.data)
if res.is_valid():
res.save()
return Response(res.data)
else:
return Response(res.errors)
- 字段少的话感觉还是用.values比较省事 - - !
- 收回刚才的话。。。未完待续
- 上面的增删改查可以通过如下方法实现
# views.py
from rest_framework import serializers
# 序列化
class DepartSerializers(serializers.ModelSerializer):
class Meta:
model = models.Depart
fields = "__all__"
class NewDepartView(ModelViewSet):
queryset = models.Depart.objects.all()
serializer_class = DepartSerializers
# urls.py
from django.contrib import admin
from django.urls import path
from drf import views
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', views.NomalAPI.as_view()),
path('drf_api/', views.CRFAPI.as_view()),
path('drf_api/depart/', views.DepartView.as_view()),
path('drf_api/depart/<int:pk>/', views.DepartView.as_view()),
# drf 单表的增删改查
path('drf_api/new/depart/', views.NewDepartView.as_view({'get': 'list', 'post': 'create'})),
path('drf_api/new/depart/<int:pk>/',
views.NewDepartView.as_view({'get': 'retrieve', 'delete': 'destroy', 'put': 'update'})),
]
换了一个视图继承,APIView换成ModelViewSet除了这两种还有其它的,看下图(摘自哔哩哔哩上面的视频https://www.bilibili.com/video/BV1aJ411H7Ej?p=772&t=1850)
注意点
继承rest framework的视图类后,request不是原来的request了,被重新封装了。request._request是原来的request.