from django.shortcuts import render from rest_framework.generics import ListAPIView,CreateAPIView,UpdateAPIView,RetrieveAPIView,DestroyAPIView from rest_framework.filters import BaseFilterBackend from rest_framework import serializers from rest_framework.pagination import PageNumberPagination from newapi import models class ArticleSerializer(serializers.ModelSerializer): author_name = serializers.CharField(source="author.username",required=False) class Meta: model = models.Article exclude = ['author'] class ArticleDetailSerializer(serializers.ModelSerializer): # 获取做者名称 author_name = serializers.CharField(source="author.username") article_content = serializers.SerializerMethodField() article_comment = serializers.SerializerMethodField() class Meta: model = models.Article # 去除文章简介 exclude = ['summary'] # 获取文章内容 def get_article_content(self,obj): result = obj.articledetail.content return result # 获取评论 def get_article_comment(self,obj): result = obj.comment_set.all().values('id','content','user__username') return result class ArticleFilter(BaseFilterBackend): """ 查询:根据URL中的cagetory参数查询 """ def filter_queryset(self, request, queryset, view): val = request.query_params.get('cagetory') if val: return queryset.filter(category = val) return queryset class ArticleView(ListAPIView,CreateAPIView): # queryset对象 queryset = models.Article.objects.all() # 序列化 serializer_class = ArticleSerializer # 筛选规则 filter_backends = [ArticleFilter,] # 分页 pagination_class = PageNumberPagination def perform_create(self,serializer): serializer.save(author_id=2) class ArticleDetailView(UpdateAPIView,RetrieveAPIView,DestroyAPIView): queryset = models.Article.objects.all() serializer_class = ArticleDetailSerializer filter_backends = [ArticleFilter, ] pagination_class = PageNumberPagination class PostCommentSerializer(serializers.ModelSerializer): author_name = serializers.CharField(source="user.username",required=False) class Meta: model = models.Comment exclude = ['user'] class CommentFilter(BaseFilterBackend): def filter_queryset(self, request, queryset, view): val = request.query_params.get('cagetory') if val: return queryset.filter(category = val) return queryset class CommentView(CreateAPIView,ListAPIView): queryset = models.Comment.objects.all() serializer_class = PostCommentSerializer filter_backends = [CommentFilter, ] pagination_class = PageNumberPagination def perform_create(self,serializer): serializer.save(user_id=2) ### 重写perform_create方法时,若是save自定义的字段数据,须要在检查数据时用exclude排除掉相应字段