DRF 视图初识

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


原文地址:https://www.cnblogs.com/os-linux/p/11815388.html