- APIview:是django中view的子类,其主要区别在于
- 传递给REST框架的请求是Request类,而不是HttpRequest
- 解析相关
- request.data:类似于request.POST
- request.query_params:类似于request.GET
- 认证相关
- request.user:认证用户
- request.auth:认证token
- 浏览器相关
- request.method:['get','post','put']
- request.content_type:
- 返回的值值Response类,而不是HttpResponse
Response(data, status=None, template_name=None, headers=None, content_type=None)
data:没经渲染的,序列化数据
- 任何
APIException
异常都将被捕获并调解为适当的响应- 在将请求分派到处理程序方法之前,将对传入的请求进行身份验证并进行适当的权限和/或限制检查
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import authentication, permissions from django.contrib.auth.models import User class ListUsers(APIView): """ View to list all users in the system. * Requires token authentication. * Only admin users are able to access this view. """ authentication_classes = [authentication.TokenAuthentication] permission_classes = [permissions.IsAdminUser] def get(self, request, format=None): """ Return a list of all users. """ usernames = [user.username for user in User.objects.all()] return Response(usernames)
- Generic views:通用视图,可以理解为一个已经封装好的,常用方法的类,如果这些方法不适合,可以下降至APIview进行编写
- 属性:
- queryset:应该用于从该视图返回对象的查询集
- serializer_class:应该用于验证和反序列化输入以及序列化输出的序列化器类
- lookup_field:用于执行单个模型实例的对象查找的模型字段,默认为pk
- pagination_class:对列表进行分页时应使用的分页类
- 方法:所有以下方法都可以重写
get_queryset(self)
get_object(self)
filter_queryset(self, queryset)
get_serializer_class(self)
- filter_backends:应该用于过滤查询集的过滤器后端类的列表
#example class UserList(generics.ListCreateAPIView): queryset = User.objects.all() serializer_class = UserSerializer permission_classes = [IsAdminUser] def list(self, request): # Note the use of `get_queryset()` instead of `self.queryset` queryset = self.get_queryset() serializer = UserSerializer(queryset, many=True) return Response(serializer.data) #重写方法 def get_queryset(self): user = self.request.user return user.accounts.all() def get_object(self): queryset = self.get_queryset() filter = {} for field in self.multiple_lookup_fields: filter[field] = self.kwargs[field] obj = get_object_or_404(queryset, **filter) self.check_object_permissions(self.request, obj) return obj def filter_queryset(self, queryset): filter_backends = [CategoryFilter] if 'geo_route' in self.request.query_params: filter_backends = [GeoRouteFilter, CategoryFilter] elif 'geo_point' in self.request.query_params: filter_backends = [GeoPointFilter, CategoryFilter] for backend in list(filter_backends): queryset = backend().filter_queryset(self.request, queryset, view=self) return queryset
- Minins:Generic views可以继承一系列的Minins类,来更快更好的编写代码
- MININS 类
- ListModelMixin:Provides a
.list(request, *args, **kwargs)
method, that implements listing a queryset.- CreateModelMixin:Provides a
.create(request, *args, **kwargs)
method, that implements creating and saving a new model instance.- RetrieveModelMixin:Provides a
.retrieve(request, *args, **kwargs)
method, that implements returning an existing model instance in a response.- UpdateModelMixin:Provides a
.update(request, *args, **kwargs)
method, that implements updating and saving an existing model instance.- DestroyModelMixin:Provides a
.destroy(request, *args, **kwargs)
method, that implements deletion of an existing model instance.具体继承GV与MININS类的实现类
CreateAPIView, extends from: GenericAPIView,CreateModelMixin, POST
ListAPIView, extends from:GenericAPIView,ListModelMixin, GET
RetrieveAPIView, extends from:GenericAPIView,RetrieveModelMixin, GET
DestroyAPIView, extends from:GenericAPIView,DestroyModelMixin, DELET
UpdateAPIView, extends from:GenericAPIView,UpdateModelMixin, PUT-PATCH
ListCreateAPIView, extends from:GenericAPIView,ListModelMixin,CreateAPIView, GET-POST
RetrieveUpdateAPIView, extends from:GenericAPIView,RetrieveAPIView,UpdateAPIView, GET-PUT-PATCH
RetrieveDestroyAPIView, extends from:GenericAPIView,RetrieveAPIView,DestroyAPIView, GET-DELETE
RetrieveUpdateDestroyAPIView, extends from:GenericAPIView,RetrieveAPIView,DestroyAPIView,UpdateAPIView, GET-PUT-PATCH-DELETE
Django restframework CBV
最新推荐文章于 2021-06-09 17:13:00 发布