drf_day03

请求和响应

请求

# 请求对象
# from rest_framework.request import Request
	def __init__(self, request, parsers=None, authenticators=None, negotiator=None, parser_context=None)
		# 二次封装request, 将原生request作为drf request对象的 _request属性
		self._request = request
	def __getattr__(self, item)
		return getattr(self._request, item)
# 请求对象.data:前端以三种编码方式传入的数据,都可以取出来
# 请求对象.query_params 与Django标准的request.GET相同, 只是更换了更正确的名字而已

响应

# from rest_framework.request import Response
	def __init__(self, status=None, template_name=None, headers=None, 
exception=False, content_type=None)

# data: 你要返回的数据, 字典
# status: 返回的状态码, 默认是200
	-from rest_framework import status  这个路径下, 它把所有的状态码都定义成立常量

# 浏览器响应成浏览器的格式,postman响应成json格式,通过配置实现的(默认配置)
# 不管是postman还是浏览器,都返回json格式数据
	- 局部使用: 对某个视图类有效
		views.py中
		
		from rest_framework.renderers import JSONRenderer

		以及你不想渲染浏览器的类里面加上:
			class TestView(APIView):
		    renderer_classes = [JSONRenderer,]

-----------------------------------------------
	- 全局使用: 全局的视图类,所以请求, 都有效
	- 	在settings.py中加入如下
	
		# 这个变量      里面都是drf的配置信息
		# drf 里面有这个默认配置     程序会先看当前项目里面有没有该配置 若没有就去默认里面找  这里有了 所以相当于覆盖了drf里面写好了的配置
		REST_FRAMEWORK = {
		    'DEFAULT_RENDERER_CLASSES': (       # 默认响应渲染类
		        'rest_framework.renderers.JSONRenderer',          # json渲染
		        # 'rest_framework.renderers.BrowsableAPIRenderer',  # 浏览器渲染
		    )
		}

视图

# 两个视图基类
APITView
GenericAPIView

基于APIView写接口 1.0

# views.py
from rest_framework.generics import GenericAPIView
from app01.models import Book
from app01.ser import BookSerializer
# 基于APIView写的
class BookView(APIView):
    def get(self, request):
        book_list = Book.objects.all()
        book_ser = BookSerializer(book_list, many=True)

        return Response(book_ser.data)

    def post(self, request):
        book_ser = BookSerializer(data=request.data)
        print(book_ser)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({
                'status': 101,
                'msg': '校验失败'
            })


class BookDetailView(APIView):
    def get(self, request, pk):
        book_list = Book.objects.filter(pk=pk).first()
        book_ser = BookSerializer(book_list)

        return Response(book_ser.data)

    def put(self, request, pk):
        book = Book.objects.filter(pk=pk).first()
        book_ser = BookSerializer(instance=book, data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({
                'status': 101,
                'msg': '校验失败'
            })

    def delete(self, request,pk):
        Book.objects.filter(pk=pk).delete()
        return Response({'status':1001, 'mag':'删除成功'})

# models.py
class Book(models.Model):
    name = models.CharField(max_length=32)
    pirce = models.DecimalField(max_digits=5, decimal_places=2)
    publish = models.CharField(max_length=32, default='23')

# ser.py
class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'

# urls.py
path('books/', views.BookView.as_view()),
re_path('books/(?P<pk>\d+)', views.BookDetailView.as_view()),

基于GenericAPIView写的接口 2.0

# views.py

# 基于GenericAPIView写的
class Book2View(GenericAPIView):
    # queryset要传queryset对象, 查询的图书
    # serializer_class 使用哪个序列化类来序列化这些数据
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    def get(self, request):
        book_list = self.get_queryset()
        book_ser = self.get_serializer(book_list, many=True)

        return Response(book_ser.data)

    def post(self, request):
        book_ser = self.get_serializer(data=request.data)
        print(book_ser)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({
                'status': 101,
                'msg': '校验失败'
            })


class Book2DetailView(GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    def get(self, request, pk):
        book_list = self.get_object()
        book_ser = self.get_serializer(book_list)

        return Response(book_ser.data)

    def put(self, request, pk):
        book = self.get_object()
        book_ser = self.get_serializer(instance=book, data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({
                'status': 101,
                'msg': '校验失败'
            })

    def delete(self, request,pk):
        self.get_object().delete()
        return Response({'status':1001, 'mag':'删除成功'})

models.py 和 ser.py 和基于APIView写接口用的是同一个
# urls.py
# 使用GenericAPIView重写的
path('books2/', views.Book2View.as_view()),
re_path('books2/(?P<pk>\d+)', views.Book2DetailView.as_view()),

基于GenericAPIView和5个视图扩展类写的接口 3.0

# views.py
from rest_framework.mixins import ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin, RetrieveModelMixin

class Book3View(GenericAPIView, ListModelMixin, CreateModelMixin):
    queryset = Book.objects
    serializer_class = BookSerializer
    def get(self, request):
        return self.list(request)

    def post(self, request):
        return self.create(request)


class Book3DetailView(GenericAPIView, RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin):
    queryset = Book.objects
    serializer_class = BookSerializer
    def get(self, request, pk):
        return self.retrieve(request, pk)

    def put(self, request, pk):
        return self.update(request, pk)

    def delete(self, request, pk):
        return self.destroy(request, pk)

# urls.py
# 使用GenericAPIView 加上 5个视图扩展类写的
    path('books3/', views.Book3View.as_view()),
    re_path('books3/(?P<pk>\d+)', views.Book3DetailView.as_view()),

基于GenericAPIView的视图子类 9个

# views.py
from rest_framework.generics import CreateAPIView, ListAPIView, UpdateAPIView,RetrieveAPIView, DestroyAPIView, ListCreateAPIView, RetrieveUpdateDestroyAPIView

class Book4View(ListAPIView,CreateAPIView):     # 这里面有两个接口    获取所有和新增一个
    queryset = Book.objects
    serializer_class = BookSerializer


class Book4DetailView(UpdateAPIView,RetrieveAPIView, DestroyAPIView):
    queryset = Book.objects
    serializer_class = BookSerializer

# urls.py
# GenericAPIView的视图子类  9个
    path('books4/', views.Book4View.as_view()),
    re_path('books4/(?P<pk>\d+)', views.Book4DetailView.as_view()),

基于ModelViewSet编写5个接口

# views.py
# 使用ModelViewSet编写5个接口
from rest_framework.viewsets import ModelViewSet
class Book5View(ModelViewSet):      # 5 个接口都有  但是路由需要配置一些信息
    queryset = Book.objects
    serializer_class = BookSerializer

# urls.py
# 使用ModeViewSet编写5个接口
    path('books5/', views.Book5View.as_view(actions={'get':'list', 'post':'create'})),
    re_path('books5/(?P<pk>\d+)', views.Book5View.as_view(actions={'get':'retrieve', 'put':'update', 'delete':'destroy'})),
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值