Django REST framework 视图和路由

一、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构建了我们的视图,并且用上了ListModelMixinCreateModelMixin

基类提供核心功能,而mixin类提供.list().create()操作。然后我们明确地将getpost方法绑定到适当的操作。

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

八、继承关系梳理

原文地址:https://www.cnblogs.com/huiyichanmian/p/12260588.html