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())
]

浙公网安备 33010602011771号