Drf-APIView

1、背景:

      继承于django原生的view,在实现的as_view方法中对原生的view做了加强,另外APIView的  request 是基于django的 Request做了加强,不在是原生的request,这一步解析是在drf.APIVIew 的 dispatch方法中完成的,主要是增加了认证以及限流等实现类

 

 

2、使用:

     view

    

class BookApiView(APIView):
    def get(self,request,*args,**kwargs):
        # 此时 request已经不是django原生的,是drf自己定义的,drf除了重写了额as_view 还重写了dispatch 方法 ,在dispatch中对request方法又重写了]
        parmers = request.query_params #等于 request.GET
        print("parmers--->",parmers)
        books = Book.objects.all()
        book_ser = BookModelSerializer(books,many=True)
        return Response({"code":500,"data":book_ser.data})

    def post(self,request,*args,**kwargs):
        ser = BookModelSerializer(data = request.data)
        if ser.is_valid(raise_exception=True): # raise_exception = True 则会向前端抛出异常
            ser.save()
        return Response({"code":1000,"data":ser.data})

  

  

    model

class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=256)
    # max_digits 总共5位 小数点后2位
    price = models.DecimalField(max_digits=5, decimal_places=2)
    author = models.CharField(max_length=256)

    def __str__(self):
        return self.name

  ser

class BookModelSerializer(ModelSerializer):
    class Meta:
        # 序列化那个表
        model = Book
        # 所有字段全部序列化
        fields = "__all__"
        # 渲染制定字段
        #fields = ('name','price')
        # 排除字段 fields 互斥
        #exclude = ("nid",)
        # 3.2 版本在之后 已经启用extra_kwargs
        # read_only_fields = ('price')
        # write_only_fileds = ('name')

        #后续需要搭配 extra_kwargs 参数指定 不能对id 主建做限制
        extra_kwargs = {
            "price":{
                "min_value":0,"required":True,"write_only":True
            }
        }

   url

urlpatterns = [
     path('admin/', admin.site.urls),
     path('book2/',ap01view.BookApiView.as_view())
]

  

posted @ 2022-08-28 17:03  Yuan_x  阅读(23)  评论(0编辑  收藏  举报