zoukankan      html  css  js  c++  java
  • 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排除掉相应字段
    
    
    
  • 相关阅读:
    高德引擎构建及持续集成技术演进之路
    Java的传值调用
    Java中真的只有值传递么?
    Centos7启动防火墙时报错Failed to start IPv4 firewall with iptables
    Redis入门(四)-Java操作Redis
    SecureCRT远程连接The remote system refused the connection问题
    [需求设计]从一个小需求感受Redis的独特魅力
    Oracle报错ORA-12516 TNS:listener could not find available handler with matching protocol stack
    编译Netty源码遇到的一些问题-缺少io.netty.util.collection包
    Linux使用alias自定义命令自定义快捷键
  • 原文地址:https://www.cnblogs.com/os-linux/p/11815388.html
Copyright © 2011-2022 走看看