一、DRF中的request
在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等。
比如,区别于Django中的request从request.GET中获取URL参数,从request.POST中取某些情况下的POST数据。
在APIView中封装的request,就实现了请求数据的解析:
对于GET请求的参数我们通过request.query_params来获取。
对于POST请求、PUT请求的数据我们通过request.data来获取。
将Django中的Request作为了自己的一个属性_request
属性和方法
content_type
stream
query_params:对于GET请求的参数获取
data: 同时兼容POST,PUT,PATCH等获取数据
user:可以直接在请求上获取用户,相当于在请求上添加一个属性,用户对象
auth:认证,相当于请求上添加一个属性,属性值是token
二、DRF中的response
依然是HttpResponse的子类,自己封装data,直接接受字典转换为JSON,以及status状态码
属性和方法
rendered_content
status_text
三、序列化
class StudentSerializer(serializers.ModelSerializer): class Meta: model = Student fields = '__all__'
四、初生牛犊不怕虎之徒手垒代码
1、路由
path(r'student/', StudentView.as_view())
2、视图
class StudentView(APIView): def get(self, request): student = Student.objects.all() stuent_serializer = StudentSerializer(student, many=True) return Response(stuent_serializer.data) def post(self, request): student_serializer = StudentSerializer(data=request.data) if student_serializer.is_valid():
student_serializer.save() return Response(student_serializer.data) return Response(data={'msg': 'error'}, status=status.HTTP_400_BAD_REQUEST)
五、小试牛刀使用混合类阶段
1、路由
path(r'comment/', CommentView.as_view()), re_path(r'student/(?P<pk>d+)/$', StudentDetailView.as_view())
2、视图1
class StudentView(mixins.CreateModelMixin, mixins.ListModelMixin, generics.GenericAPIView): queryset = Student.objects.all() # 必须是queryset serializer_class = StudentSerializer def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs)
我们使用GenericAPIView
构建了我们的视图,并且用上了ListModelMixin
和CreateModelMixin
。
基类提供核心功能,而mixin类提供.list()
和.create()
操作。然后我们明确地将get
和post
方法绑定到适当的操作。
3、视图2
class StudentDetailView(mixins.RetrieveModelMixin, mixins.CreateModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView): queryset = Student.objects.all() serializer_class = StudentSerializer def get(self, request, *args, **kwargs): return self.retrieve(request, *args, **kwargs) def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs) def put(self, request, *args, **kwargs): return self.update(request, *args, **kwargs) def delete(self, request, *args, **kwargs): return self.destroy(request, *args, **kwargs)
非常相似。这一次我们使用GenericAPIView
类来提供核心功能,并添加mixins来提供.retrieve()
,.create(),.update()
和.destroy()
操作。
我们发现在没有查询到数据的时候也不会报错,会返回错误信息。
注意:必须在路由中指定‘pk’,用于操作单个数据。
六、牛气冲天之使用通用类
1、路由
path(r'comment/', CommentView.as_view()), re_path(r'student/(?P<pk>d+)/$', StudentDetailView.as_view())
2、视图1
class StudentView(ListCreateAPIView): # 获取所有数据 queryset = Student.objects.all() serializer_class = StudentSerializer
3、视图2
class StudentDetailView(RetrieveUpdateDestroyAPIView): # 对指定的单条数据进行增删改查 queryset = Student.objects.all() serializer_class = StudentSerializer
七、牛牛牛牛之使用视图集
1、路由
path('student/', StudentView.as_view({ 'get': 'list', 'post': 'create' })), re_path(r'student/(?P<pk>d+)/$', StudentView.as_view({ 'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy' }))
2、视图
class StudentView(ModelViewSet): queryset = Student.objects.all() serializer_class = StudentSerializer
3、高级路由
router = DefaultRouter() router.register(r'student', StudentView) urlpatterns += router.urls