class GenericAPIView(views.APIView):
queryset = None
serializer_class = None
lookup_field = 'pk'
lookup_url_kwarg = None
filter_backends = api_settings.DEFAULT_FILTER_BACKENDS
pagination_class = api_settings.DEFAULT_PAGINATION_CLASS
def get_object(self):
queryset = self.filter_queryset(self.get_queryset())} # 拿到查询集
obj = get_object_or_404(queryset, **filter_kwargs) # 拿到通过pk查询出来的模型
self.check_object_permissions(self.request, obj) # 权限校验
return obj
def get_serializer(self, *args, **kwargs):
serializer_class = self.get_serializer_class()
kwargs.setdefault('context', self.get_serializer_context()) # 往ser中追加了一些信息
return serializer_class(*args, **kwargs)# BaseSerializer(*args,**kwargs)
#
def get_serializer_context(self):
return {
'request': self.request,
'format': self.format_kwarg,
'view': self
}
def check_object_permissions(self, request, obj):
for permission in self.get_permissions():
if not permission.has_object_permission(request, self, obj):
self.permission_denied(
request,
message=getattr(permission, 'message', None),
code=getattr(permission, 'code', None)
)
def permission_denied(self, request, message=None, code=None):
if request.authenticators and not request.successful_authenticator: # 判断是否有登录认证通过
raise exceptions.NotAuthenticated()
raise exceptions.PermissionDenied(detail=message, code=code)
GenericAPIView常用方法
于 2023-10-08 09:46:35 首次发布