摘要:注意,在提供序列化器對象的時候,會向對象的屬性補充三個數據,這三個數據對象可以在定義序列化器時使用。舉例以圖書與英雄案例如水滸傳與英雄對應的路由數據查詢集數據庫查詢集數據庫查詢構建序列化器對象進行序列化操作對應的路由查詢單個
基于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/(?P d+)/$", 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)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/42434.html
摘要:上一節項目框架已經搭建完畢,現在開始連接數據庫,創建數據庫設置默認安裝了數據庫打開文件數據庫引擎數據庫的名字小貼士如果你選擇,數據庫是以文件的形式生成,要設置成絕對路徑創建表結構創建模型激活模型執行命令執行成功后目錄結構如下圖 上一節項目框架已經搭建完畢,現在開始連接數據庫,創建model 1、數據庫設置python默認安裝了sqlite數據庫 打開文件:dayang/settings...
摘要:試想,在多線程服務器中,多個線程同時處理不同客戶端發送的不同請求時,每個線程看到的對象必然不同。多線程服務器會創建一個線程池,再從線程池中選擇一個線程用于處理接收到的請求。 框架 Django flask flask是一個輕量的web開發應用示例開發一個小應用 from flask import Flask app = Flask(__name__) @app.route(/) d...
摘要:月份發布了第版,收到不少網友的良好建議,所以又抽空進行了完善,當然也拖了不少時間。本書主要介紹的基本使用,這也是我一開始在學習過程中經常用到的。第章實戰,介紹了如何開發一個簡單的應用。聲明本書由編寫,采用協議發布。 showImg(https://segmentfault.com/img/remote/1460000007484050?w=200&h=152); 書籍地址 head-f...
摘要:本文主要是用來記錄自己學習的過程。其中可能會有很多自己的錯誤理解。這里主要會用到的知識有百度百科阮一峰理解架構其余請自行百度。所有的全局設置都放在的字典中。使用標準的權限,未認證的用戶只讀權限不要忘記將添加到你的中。 本文主要是用來記錄自己學習django-rest-framework的過程。其中可能會有很多自己的錯誤理解。 這里主要會用到的知識有 1. [django](https:...
閱讀 1058·2021-11-18 10:02
閱讀 1314·2021-09-23 11:22
閱讀 2617·2021-08-21 14:08
閱讀 1643·2019-08-30 15:55
閱讀 1729·2019-08-30 13:45
閱讀 3169·2019-08-29 16:52
閱讀 3100·2019-08-29 12:18
閱讀 1644·2019-08-26 13:36