资讯专栏INFORMATION COLUMN

Django框架的学习笔记

freecode / 2782人阅读

摘要:注意,在提供序列化器对象的时候,会向对象的属性补充三个数据,这三个数据对象可以在定义序列化器时使用。举例以图书与英雄案例如水浒传与英雄对应的路由数据查询集数据库查询集数据库查询构建序列化器对象进行序列化操作对应的路由查询单个

基于Django的REST framework 框架的视图说明(二)

开发环境:Ubuntu16.04+Python3.5x+Pycharm2018.2

包含方法和属性的通用视图基类及扩展类的继承关系

两个基类 APIView类 GenericAPIView类

本篇主要说明GenericAPIView类
rest_framework.generics.GenericAPIView

继承自APIView,增加了对于列表视图和详情视图可能用到的通用支持方法。通常使用时,可搭配一个或多个Mixin扩展类.

支持定义的属性:

列表视图与详情视图通用:
queryset 列表视图的查询集
serializer_class 视图使用的序列化器

列表视图使用:
pagination_class 分页控制类
filter_backends 过滤控制后端

详情页视图使用:
lookup_field 查询单一数据库对象时使用的条件字段,默认为"pk"
lookup_url_kwarg 查询单一数据时URL中的参数关键字名称,默认与look_field相同

源代码如下:

    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

支持定义的方法:

列表视图与详情视图通用:

get_queryset(self)
源码如下:

   def get_queryset(self):
        """
        Get the list of items for this view.
        This must be an iterable, and may be a queryset.
        Defaults to using `self.queryset`.

        This method should always be used rather than accessing `self.queryset`
        directly, as `self.queryset` gets evaluated only once, and those results
        are cached for all subsequent requests.

        You may want to override this if you need to provide different
        querysets depending on the incoming request.

        (Eg. return a list of items that is specific to the user)
        """
        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

返回视图使用的查询集,是列表视图与详情视图获取数据的基础,默认返回queryset属性,可以重写,例如:

def get_queryset(self):
    user = self.request.user
    return user.accounts.all()      

get_serializer_class(self)

    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

返回序列化器类,默认返回serializer_class,可以重写,例如:

def get_serializer_class(self):
    if self.request.user.is_staff:
        return FullAccountSerializer
    return BasicAccountSerializer
    

get_serializer(self, args, **kwargs)
返回序列化器对象,被其他视图或扩展类使用,如果我们在视图中想要获取序列化器对象,可以直接调用此方法。

注意,在提供序列化器对象的时候,REST framework会向对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。

详情视图使用:

get_object(self)

   def get_object(self):
        """
        Returns the object the view is displaying.

        You may want to override this if you need to provide non-standard
        queryset lookups.  Eg if objects are referenced using multiple
        keyword arguments in the url conf.
        """
        queryset = self.filter_queryset(self.get_queryset())

        # Perform the lookup filtering.
        lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field

        assert lookup_url_kwarg in self.kwargs, (
            "Expected view %s to be called with a URL keyword argument "
            "named "%s". Fix your URL conf, or set the `.lookup_field` "
            "attribute on the view correctly." %
            (self.__class__.__name__, lookup_url_kwarg)
        )

        filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]}
        obj = get_object_or_404(queryset, **filter_kwargs)

        # May raise a permission denied
        self.check_object_permissions(self.request, obj)

        return obj

返回详情视图所需的模型类数据对象,默认使用lookup_field参数来过滤queryset。 在试图中可以调用该方法获取详情信息的模型类对象。

若详情访问的模型类对象不存在,会返回404。

def get_object_or_404(queryset, *filter_args, **filter_kwargs):
    """
    Same as Django"s standard shortcut, but make sure to also raise 404
    if the filter_kwargs don"t match the required types.
    """
    try:
        return _get_object_or_404(queryset, *filter_args, **filter_kwargs)
    except (TypeError, ValueError, ValidationError):
        raise Http404

该方法会默认使用APIView提供的check_object_permissions方法检查当前对象是否有权限被访问。

举例:以图书与英雄案例(如水浒传与英雄)

# GET /books/
# url(r"^books/$", views.BookListAPIView.as_view()) 对应的路由
class BookListAPIView(GenericAPIView):
    """
    数据查询集
    """
    queryset = BookInfo.objects.all()  # 数据库查询集
    serializer_class = BookInfoSerializer

    def get(self,request):
        # 数据库查询
        qs = self.get_queryset()
        # 构建序列化器对象,进行序列化操作
        serializer = self.get_serializer(qs,many = True)

        return  Response(serializer.data)

# GET /books//
# url(r"^books/(?Pd+)/$", views.BookDetailView.as_view()) 对应的路由
class BookDetailAPIView(GenericAPIView):
    queryset = BookInfo.objects.all()

    serializer_class = BookInfoSerializer


    def get(self,request,pk):
        """
        查询单个
        :param query:
        :return:
        """
        book = self.get_object()
        serializer = self.get_serializer(book)

        return Response(serializer.data)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42434.html

相关文章

  • python第三方库之Django学习笔记

    摘要:上一节项目框架已经搭建完毕,现在开始连接数据库,创建数据库设置默认安装了数据库打开文件数据库引擎数据库的名字小贴士如果你选择,数据库是以文件的形式生成,要设置成绝对路径创建表结构创建模型激活模型执行命令执行成功后目录结构如下图 上一节项目框架已经搭建完毕,现在开始连接数据库,创建model 1、数据库设置python默认安装了sqlite数据库 打开文件:dayang/settings...

    Java3y 评论0 收藏0
  • Python学习笔记:Web后端开发一览

    摘要:试想,在多线程服务器中,多个线程同时处理不同客户端发送的不同请求时,每个线程看到的对象必然不同。多线程服务器会创建一个线程池,再从线程池中选择一个线程用于处理接收到的请求。 框架 Django flask flask是一个轻量的web开发应用示例开发一个小应用 from flask import Flask app = Flask(__name__) @app.route(/) d...

    DrizzleX 评论0 收藏0
  • 第一本 gitbook: Flask Web 开发笔记

    摘要:月份发布了第版,收到不少网友的良好建议,所以又抽空进行了完善,当然也拖了不少时间。本书主要介绍的基本使用,这也是我一开始在学习过程中经常用到的。第章实战,介绍了如何开发一个简单的应用。声明本书由编写,采用协议发布。 showImg(https://segmentfault.com/img/remote/1460000007484050?w=200&h=152); 书籍地址 head-f...

    KevinYan 评论0 收藏0
  • django rest framework个人学习笔记(一)————Install

    摘要:本文主要是用来记录自己学习的过程。其中可能会有很多自己的错误理解。这里主要会用到的知识有百度百科阮一峰理解架构其余请自行百度。所有的全局设置都放在的字典中。使用标准的权限,未认证的用户只读权限不要忘记将添加到你的中。 本文主要是用来记录自己学习django-rest-framework的过程。其中可能会有很多自己的错误理解。 这里主要会用到的知识有 1. [django](https:...

    yuxue 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<