zoukankan      html  css  js  c++  java
  • drf获取请求过来时的request

    0. 获取请求过来时的request

    """
    
    获取请求时带过来的request,结合drf认证组件,判断用户的登录状态,
    
    来获取用户的粒度操作,比如点赞/收藏/关注 的取消与私有化,
    
    示例:用在序列化中的字段钩子方法
    
    """
    from rest_framework import serializers
    from rest_framework.generics import ListAPIView
    from api.serializer.articlelist import ArticleListSerializer
    from api import models
    
    
    
    class ArticleSerializer(serializers.ModelSerializer):
    
        faver = serialiers.SerializerMethodField()
        
        class Meta:
            model = models.ArticleDetail
            fields = "__all__"
            
        def get_faver(self,obj):
            
            request = self.context["request"]
            
            if not request.user:
                return False
            exists = models.ArticleDetail.objects
            
    
    
    
    class ArticleListView(ListAPIView):
        queryset = models.ArticleDetail.objects
        serializer_class = ArticleListSerializer
    

    1. get方法(ListAPIView)

    class ListAPIView(mixins.ListModelMixin,
                  GenericAPIView):
    	"""
    	Concrete view for listing a queryset.
    	"""
    	def get(self, request, *args, **kwargs):
    		return self.list(request, *args, **kwargs)
    

    2. list方法(ListModelMixin)

    class ListModelMixin:
    	"""
    	List a queryset.
    	"""
    	def list(self, request, *args, **kwargs):
    		queryset = self.filter_queryset(self.get_queryset())
    
    		page = self.paginate_queryset(queryset)
    		if page is not None:
    			serializer = self.get_serializer(page, many=True)
    			return self.get_paginated_response(serializer.data)
    
    		serializer = self.get_serializer(queryset, many=True)
    		return Response(serializer.data)
    

    3. get_queryset方法(GenericAPIView)

    class GenericAPIView(views.APIView):
    
        queryset = None
        serializer_class = None
        
        def get_queryset(self):
        
            assert self.queryset is not None, (
                "'%s' should either include a `queryset` attribute, "
                "or override the `get_queryset()` method."
                % self.__class__.__name__
            )
    
            queryset = self.queryset
            if isinstance(queryset, QuerySet):
                # Ensure queryset is re-evaluated on each request.
                queryset = queryset.all()
            return queryset
    

    4. get_serializer(GenericAPIView)

    def get_serializer(self, *args, **kwargs):
        """
        Return the serializer instance that should be used for validating and
        deserializing input, and for serializing output.
        """
        serializer_class = self.get_serializer_class()
        
        kwargs['context'] = self.get_serializer_context()
        
        return serializer_class(*args, **kwargs)
    

    5. get_serializer_class(GenericAPIView)

    def get_serializer_class(self):
        """
        Return the class to use for the serializer.
        Defaults to using `self.serializer_class`.
    
        You may want to override this if you need to provide different
        serializations depending on the incoming request.
    
        (Eg. admins get full serialization, others get basic serialization)
        """
        assert self.serializer_class is not None, (
            "'%s' should either include a `serializer_class` attribute, "
            "or override the `get_serializer_class()` method."
            % self.__class__.__name__
        )
    
        return self.serializer_class
    

    6. get_serializer_context(GenericAPIView)

    def get_serializer_context(self):
        """
        Extra context provided to the serializer class.
        """
        return {
            'request': self.request,
            'format': self.format_kwarg,
            'view': self
        }
    希望你眼眸有星辰,心中有山海,从此以梦为马,不负韶华
  • 相关阅读:
    2018-2019-1 20165229 20165306 实验五 通讯协议设计
    2018-2019-1 20165306 《信息安全系统设计基础》第十一周学习总结
    2018-2019-1 20165229 20165306 实验四 外设驱动程序设计
    2018-2019-1 20165229 20165306 实验三 实时系统
    2018-2019-1 20165306 《信息安全系统设计基础》第七周学习总结
    2018-2019-1 20165229 20165306 实验二 固件程序设计
    2018-2019-1 20165306 《信息安全系统设计基础》第六周学习总结
    2018-2019-1 20165306 《信息安全系统设计基础》第五周学习总结
    2018-2019-1 20165306 《信息安全系统设计基础》第四周学习总结
    2018-2019-1 20165229 20165306 实验一 开发环境的熟悉
  • 原文地址:https://www.cnblogs.com/daviddd/p/12202498.html
Copyright © 2011-2022 走看看