from article.models import Article from article.serializers import ArticleListSerializer, ArticleDetailSerializer from rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework.views import APIView from django.http import Http404 from rest_framework import mixins from rest_framework import generics from rest_framework import status from article.permissions import IsAdminUserOrReadOnly @api_view(['GET', 'POST']) def article_list(request): # 获取所有文章列表 if request.method == 'GET': articles = Article.objects.all() serializer = ArticleListSerializer(articles, many=True) return Response(serializer.data) # 创建新的文章 elif request.method == 'POST': serializer = ArticleListSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) # 和article_list()功能相同 class ArticleList(generics.ListCreateAPIView): # 添加用户权限 permission_classes = [IsAdminUserOrReadOnly] queryset = Article.objects.all() serializer_class = ArticleListSerializer def perform_create(self, serializer): # 在序列化数据真正保存之前调用 serializer.save(author=self.request.user) # 第一种版本 # class ArticleDetail(APIView): # """文章详情视图""" # def get_object(self, pk): # """获取单个文章对象""" # try: # # pk代表主键 # return Article.objects.get(pk=pk) # except: # raise Http404 # # def get(self, request, pk): # article = self.get_object(pk) # serializer = ArticleDetailSerializer(article) # # 返回Json数据 # return Response(serializer.data) # # def put(self, request, pk): # article = self.get_object(pk) # serializer = ArticleDetailSerializer(article, data=request.data) # # 验证提交的数据是否合法 # # 不合法就返回400 # if serializer.is_valid(): # # 序列化器将持有的数据反序列化后 # # 保存到数据库 # serializer.save() # return Response(serializer.data) # return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) # # def delete(self, request, pk): # article = self.get_object(pk=pk) # article.delete() # # 删除成功后返回204 # return Response(status=status.HTTP_204_NO_CONTENT) # 第二种版本 # class ArticleDetail(mixins.RetrieveModelMixin, # mixins.UpdateModelMixin, # mixins.DestroyModelMixin, # generics.GenericAPIView): # """文章详情视图""" # queryset = Article.objects.all() # # 序列化类 # serializer_class = ArticleDetailSerializer # # def get(self, request, *args, **kwargs): # return self.retrieve(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) # ArticleDetail类还可以简化为下面的代码 class ArticleDetail(generics.RetrieveUpdateDestroyAPIView): permission_classes = [IsAdminUserOrReadOnly] queryset = Article.objects.all() serializer_class = ArticleDetailSerializer