DRF(django restframework)-数据库查询结果序列化

  • 先看下手动序列化的
# -*- 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)

URL不含pk

url含pk

  • 字段少的话感觉还是用.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.

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值