成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Django框架的學(xué)習(xí)筆記

freecode / 2963人閱讀

摘要:注意,在提供序列化器對象的時候,會向?qū)ο蟮膶傩匝a充三個數(shù)據(jù),這三個數(shù)據(jù)對象可以在定義序列化器時使用。舉例以圖書與英雄案例如水滸傳與英雄對應(yīng)的路由數(shù)據(jù)查詢集數(shù)據(jù)庫查詢集數(shù)據(jù)庫查詢構(gòu)建序列化器對象進行序列化操作對應(yīng)的路由查詢單個

基于Django的REST framework 框架的視圖說明(二)

開發(fā)環(huán)境:Ubuntu16.04+Python3.5x+Pycharm2018.2

包含方法和屬性的通用視圖基類及擴展類的繼承關(guān)系

兩個基類 APIView類 GenericAPIView類

本篇主要說明GenericAPIView類
rest_framework.generics.GenericAPIView

繼承自APIView,增加了對于列表視圖和詳情視圖可能用到的通用支持方法。通常使用時,可搭配一個或多個Mixin擴展類.

支持定義的屬性:

列表視圖與詳情視圖通用:
queryset 列表視圖的查詢集
serializer_class 視圖使用的序列化器

列表視圖使用:
pagination_class 分頁控制類
filter_backends 過濾控制后端

詳情頁視圖使用:
lookup_field 查詢單一數(shù)據(jù)庫對象時使用的條件字段,默認為"pk"
lookup_url_kwarg 查詢單一數(shù)據(jù)時URL中的參數(shù)關(guān)鍵字名稱,默認與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

返回視圖使用的查詢集,是列表視圖與詳情視圖獲取數(shù)據(jù)的基礎(chǔ),默認返回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)
返回序列化器對象,被其他視圖或擴展類使用,如果我們在視圖中想要獲取序列化器對象,可以直接調(diào)用此方法。

注意,在提供序列化器對象的時候,REST framework會向?qū)ο蟮腸ontext屬性補充三個數(shù)據(jù):request、format、view,這三個數(shù)據(jù)對象可以在定義序列化器時使用。

詳情視圖使用:

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

返回詳情視圖所需的模型類數(shù)據(jù)對象,默認使用lookup_field參數(shù)來過濾queryset。 在試圖中可以調(diào)用該方法獲取詳情信息的模型類對象。

若詳情訪問的模型類對象不存在,會返回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方法檢查當(dāng)前對象是否有權(quán)限被訪問。

舉例:以圖書與英雄案例(如水滸傳與英雄)

# GET /books/
# url(r"^books/$", views.BookListAPIView.as_view()) 對應(yīng)的路由
class BookListAPIView(GenericAPIView):
    """
    數(shù)據(jù)查詢集
    """
    queryset = BookInfo.objects.all()  # 數(shù)據(jù)庫查詢集
    serializer_class = BookInfoSerializer

    def get(self,request):
        # 數(shù)據(jù)庫查詢
        qs = self.get_queryset()
        # 構(gòu)建序列化器對象,進行序列化操作
        serializer = self.get_serializer(qs,many = True)

        return  Response(serializer.data)

# GET /books//
# url(r"^books/(?Pd+)/$", views.BookDetailView.as_view()) 對應(yīng)的路由
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)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/42434.html

相關(guān)文章

  • python第三方庫之Django學(xué)習(xí)筆記

    摘要:上一節(jié)項目框架已經(jīng)搭建完畢,現(xiàn)在開始連接數(shù)據(jù)庫,創(chuàng)建數(shù)據(jù)庫設(shè)置默認安裝了數(shù)據(jù)庫打開文件數(shù)據(jù)庫引擎數(shù)據(jù)庫的名字小貼士如果你選擇,數(shù)據(jù)庫是以文件的形式生成,要設(shè)置成絕對路徑創(chuàng)建表結(jié)構(gòu)創(chuàng)建模型激活模型執(zhí)行命令執(zhí)行成功后目錄結(jié)構(gòu)如下圖 上一節(jié)項目框架已經(jīng)搭建完畢,現(xiàn)在開始連接數(shù)據(jù)庫,創(chuàng)建model 1、數(shù)據(jù)庫設(shè)置python默認安裝了sqlite數(shù)據(jù)庫 打開文件:dayang/settings...

    Java3y 評論0 收藏0
  • Python學(xué)習(xí)筆記:Web后端開發(fā)一覽

    摘要:試想,在多線程服務(wù)器中,多個線程同時處理不同客戶端發(fā)送的不同請求時,每個線程看到的對象必然不同。多線程服務(wù)器會創(chuàng)建一個線程池,再從線程池中選擇一個線程用于處理接收到的請求。 框架 Django flask flask是一個輕量的web開發(fā)應(yīng)用示例開發(fā)一個小應(yīng)用 from flask import Flask app = Flask(__name__) @app.route(/) d...

    DrizzleX 評論0 收藏0
  • 第一本 gitbook: Flask Web 開發(fā)筆記

    摘要:月份發(fā)布了第版,收到不少網(wǎng)友的良好建議,所以又抽空進行了完善,當(dāng)然也拖了不少時間。本書主要介紹的基本使用,這也是我一開始在學(xué)習(xí)過程中經(jīng)常用到的。第章實戰(zhàn),介紹了如何開發(fā)一個簡單的應(yīng)用。聲明本書由編寫,采用協(xié)議發(fā)布。 showImg(https://segmentfault.com/img/remote/1460000007484050?w=200&h=152); 書籍地址 head-f...

    KevinYan 評論0 收藏0
  • django rest framework個人學(xué)習(xí)筆記(一)————Install

    摘要:本文主要是用來記錄自己學(xué)習(xí)的過程。其中可能會有很多自己的錯誤理解。這里主要會用到的知識有百度百科阮一峰理解架構(gòu)其余請自行百度。所有的全局設(shè)置都放在的字典中。使用標(biāo)準的權(quán)限,未認證的用戶只讀權(quán)限不要忘記將添加到你的中。 本文主要是用來記錄自己學(xué)習(xí)django-rest-framework的過程。其中可能會有很多自己的錯誤理解。 這里主要會用到的知識有 1. [django](https:...

    yuxue 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<