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排除掉相應字段