zoukankan      html  css  js  c++  java
  • django 视图GenericView

    from rest_framework.generics import GenericAPIView
    from .models import Student,TeacherClass,Teacher,Class
    from  .serializers import SerializerStudent
    from rest_framework.response import Response
    from rest_framework.status import HTTP_200_OK
    
    
    
    class  StudentGenericView(GenericAPIView):
        queryset = Student.objects.filter(is_delete=False).all()
        serializer_class = SerializerStudent
    
        def get(self,request,pk):
            if pk :
                student=self.get_object() # one row
                serializer=SerializerStudent(instance=student)
                return Response(data=serializer.data,status=HTTP_200_OK)
    
            else:
                students=self.get_queryset() # all rows
                serializer=SerializerStudent(instance=students,many=True)
                return Response(data=serializer.data,status=HTTP_200_OK)
    
        def post(self,request,*args,**kwargs):
            serializer=SerializerStudent(data=request.data)
            if serializer.is_valid():
                serializer.save()
                data,status=serializer.data,200
            else:
                data,status=serializer.errors,400
    
            return  Response(data=data,status=status)
    
    
        def put(self,request,pk):
            student=self.get_object()
            serializer=SerializerStudent(instance=student,data=request.data)
            if serializer.is_valid():
                serializer.save()
                data=serializer.data
            else:
                data=serializer.errors
            return Response(data=data, status=HTTP_200_OK)
    
        def delete(self,request,pk):
            if pk :
                instance=self.get_object()
                instance.is_delete=True
                instance.save()
                serializer=SerializerStudent(instance=instance)
                return Response(data=serializer.data)
    

     以上是基于GenericView实现增删改查,实现是单个查询借助self.get_object()以及路由pk进行查询,批量所有数据集合借助queryset,序列化器借助serializer_class

    源码解析:

    class GenericAPIView(views.APIView):
    """
    Base class for all other generic views.它是其他所有generic的视图的基类视图,提供了self.get_serializer_class 方法,self.get_object方法
      其次继承了Apiview,dispatch inital 方法

    """
    # You'll need to either set these attributes,
    # or override `get_queryset()`/`get_serializer_class()`.
    # If you are overriding a view method, it is important that you call
    # `get_queryset()` instead of accessing the `queryset` property directly,
    # as `queryset` will get evaluated only once, and those results are cached
    # for all subsequent requests.
    queryset = None
    serializer_class = None

    # If you want to use object lookups other than pk, set 'lookup_field'.
    # For more complex lookup requirements override `get_object()`.
    lookup_field = 'pk'
    lookup_url_kwarg = None

    # The filter backend classes to use for queryset filtering
    filter_backends = api_settings.DEFAULT_FILTER_BACKENDS

    # The style to use for queryset pagination.
    pagination_class = api_settings.DEFAULT_PAGINATION_CLASS

    generic 视图方法包括以下几个

     mixmin里面实现了几个重要mixmin类基于list,update,destroy,create 方法:

     在五个基本的generic 视图类身上又进一步多继承实现了更加简单丰富的类方法:

    modelviewset:

    from rest_framework.viewsets import ViewSet,GenericViewSet,ModelViewSet
    源码解读:

     url.py

    urlpatterns = [
        url(r'^student/$',model_view.StudentModelView.as_view({"get":"list","post":"create"})),
        url(r'^student/(?P<pk>.*)$', model_view.StudentModelView.as_view({"get": "retrieve",
                                                                          "put": "update","delete":"destroy"})),
    
    ]
    

    Response 代码解读:

    第一步调用get_objectc查询对象:

    第二步:没找到就报Http404

  • 相关阅读:
    go语言从例子开始之Example22.协程之通道
    go语言从例子开始之Example21.协程
    go语言从例子开始之Example20.错误处理
    go语言从例子开始之Example19.接口
    级联复制改成主从复制
    一主二从改成级联复制架构步骤
    mysql8.0 备分常用命令
    mysql8基于gtid导出导入搭建主从
    MySQL 8.0 配置mysql_native_password身份验证插件的密码
    mysql_config_editor 安全登录方式
  • 原文地址:https://www.cnblogs.com/SunshineKimi/p/13871814.html
Copyright © 2011-2022 走看看