DRF基本视图——继承GenericAPIView

本文介绍使用Django REST framework实现序列化返回模型类对象的方法,包括获取列表资源、新增对象、获取单一资源及全更新等操作。
  • 1、获取列表资源 —— 序列化返回多个模型类对象
  • 继承自GenericAPIView,它提供了下面的方法:
    self.get_queryset():获取查询集;需指定哪个模型类(定义类属性 queryset =
    self.get_serializer():实例化序列化器对象;需指定哪个序列化器(定义类属性serializer_class =
from rest_framework import status
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response

from .models import *
from .serializers import *


class BooksView(GenericAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoModelSerializer
    # 1、获取列表资源 —— 序列化返回多个模型类对象
    def get(self, request):
        # 1、获取查询集get_queryset()方法
        # (1)需指定哪个模型类
        books = self.get_queryset()  # 该函数可以确保每一次请求获取到到是最新到查询集数据
        # 2、实例化序列化器对象get_serializer()方法
        # (1)需指定哪个序列化器
        serializer = self.get_serializer(instance=books, many=True)
        # 3、序列化返回
        return Response(data=serializer.data)
        
    # 新增单一对象
    def post(self, request):
        bs = self.get_serializer(data=request.data)
        if not bs.is_valid():
            return Response(data={'errmsg': '参数错误'}, status=status.HTTP_400_BAD_REQUEST)
        bs.save()
        return Response(data=bs.data)
  • 3、获取单一资源 —— 序列化返回单一模型类对象
    注意两个方法:
    -lookup_field = 'pk'# 该类属性默认值就是’pk’ —— 默认唯一过滤依据’pk’字段
  • lookup_url_kwarg ='pk # 该类属性默认等于lookup_field —— 指定提取过滤字段值的分组名称
class BookView(GenericAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoModelSerializer

    # lookup_field = 'pk' # 该类属性默认值就是'pk' —— 默认唯一过滤依据'pk'字段
    # lookup_url_kwarg = lookup_field # 该类属性默认等于lookup_field —— 指定提取过滤字段值的分组名称

    # 3、获取单一资源 —— 序列化返回单一模型类对象
    # GET + /books/1/
    def get(self, request, pk):
        # 依据:
        #   (1)、查询集;—— 默认类属性cls.queryset
        #   (2)、过滤依据字段;—— 默认类属性cls.lookup_field
        #   (3)、获取字段值 —— 通过类属性cls.lookup_url_kwarg指定的正则分组名提取过滤字段的值
        book = self.get_object()
        serializer = self.get_serializer(instance=book)
        return Response(data=serializer.data)
        
    # 全更新
    def put(self, request, pk):
        book = self.get_object()
        bs = self.get_serializer(instance=book, data=request.data)
        if not bs.is_valid():
            return Response(data={'errmsg':'参数有误'}, status=status.HTTP_400_BAD_REQUEST)
        bs.save()
        return Response(data=bs.data)

    # 部分更新
    def patch(self, request, pk):
        book = self.get_object()
        bs = self.get_serializer(instance=book, data=request.data, partial=True)
        if not bs.is_valid():
            return Response(data={'errmsg': '参数有误'}, status=status.HTTP_400_BAD_REQUEST)
        bs.save()
        return Response(data=bs.data)

    # 删除单一对象
    def delete(self,request, pk):
        book = self.get_object()
        book.delete()
        return Response(data=None, status=status.HTTP_204_NO_CONTENT)
  • 路由映射:
from django.contrib import admin
from django.urls import path,re_path

from books_test.views import *

urlpatterns = [
    path('admin/', admin.site.urls),
    # 获取多个对象
    re_path(r'^books/$', BooksView.as_view()),
    # 获取单一资源:GET + /books/(?P<pk>\d+)/ = self.get
    re_path(r'^books/(?P<pk>\d+)/$', BookView.as_view()),
]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值