1. 程式人生 > >Django-Rest framework中文翻譯-generic-views

Django-Rest framework中文翻譯-generic-views

通用檢視

Django的通用檢視......被開發為常見用法模式的快捷方式......它們採用檢視開發中的某些常見習語和模式並對其進行抽象,以便您可以快速編寫資料的常用檢視,而無需重複自己。

- Django文件

基於類的檢視的一個主要好處是它們允許您組合可重用行為的方式。REST框架通過提供許多預先構建的檢視來提供常用模式來利用這一點。

REST框架提供的通用檢視允許您快速構建與您的資料庫模型緊密相關的API檢視。

如果通用檢視不適合您的API需求,您可以直接使用常規APIView類,或者重用通用檢視使用的mixins和基類來組成您自己的可重用通用檢視集。

例子

通常,在使用通用檢視時,您將覆蓋檢視,並設定多個類屬性。

from django.contrib.auth.models import User
from myapp.serializers import UserSerializer
from rest_framework import generics
from rest_framework.permissions import IsAdminUser

class UserList(generics.ListCreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes 
= (IsAdminUser,)

對於更復雜的情況,您可能還希望覆蓋檢視類上的各種方法。例如。

class UserList(generics.ListCreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = (IsAdminUser,)

def list(self, request):
# Note the use of `get_queryset()` instead of `self.queryset`
queryset = self.get_queryset()
serializer 
= UserSerializer(queryset, many=True) return Response(serializer.data)

對於非常簡單的情況,您可能希望使用該.as_view()方法傳遞任何類屬性。例如,您的URLconf可能包含以下條目:

url(r'^/users/', ListCreateAPIView.as_view(queryset=User.objects.all(), serializer_class=UserSerializer), name='user-list')

API參考

GenericAPIView
此類擴充套件了REST框架的APIView類,為標準列表和詳細資訊檢視添加了常用的行為。

提供的每個具體通用檢視是通過GenericAPIView與一個或多個mixin類組合而構建的。

屬性

基本設定:

以下屬性控制基本檢視行為。

queryset - 應該用於從此檢視返回物件的查詢集。通常,您必須設定此屬性,或覆蓋該get_queryset()方法。如果要覆蓋檢視方法,則必須呼叫get_queryset()而不是直接訪問此屬性,因為queryset將進行一次評估,並且將為所有後續請求快取這些結果。
serializer_class - 應該用於驗證和反序列化輸入以及序列化輸出的序列化程式類。通常,您必須設定此屬性,或覆蓋該get_serializer_class()方法。
lookup_field - 應用於執行單個模型例項的物件查詢的模型欄位。預設為'pk'。請注意,使用超連結的API時,您需要確保雙方的API意見和序列類設定查詢欄位,如果你需要使用一個自定義值。
lookup_url_kwarg - 應該用於物件查詢的URL關鍵字引數。URL conf應包含與此值對應的關鍵字引數。如果未設定,則預設使用相同的值lookup_field。

分頁:

與列表檢視一起使用時,以下屬性用於控制分頁。

pagination_class - 分頁列表結果時應使用的分頁類。預設為與DEFAULT_PAGINATION_CLASS設定相同的值,即'rest_framework.pagination.PageNumberPagination'。設定pagination_class=None將禁用此檢視上的分頁。

過濾:

filter_backends - 應該用於過濾查詢集的過濾器後端類列表。預設值與DEFAULT_FILTER_BACKENDS設定相同。
方法

基本方法:

get_queryset(self)

返回應該用於列表檢視的查詢集,該查詢集應該用作詳細檢視中查詢的基礎。預設返回queryset屬性指定的查詢集。

應始終使用此方法而不是self.queryset直接訪問,因為self.queryset只進行一次評估,併為所有後續請求快取這些結果。

可以重寫以提供動態行為,例如返回查詢集,該查詢集特定於發出請求的使用者。

例如:

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

返回應該用於詳細檢視的物件例項。預設使用lookup_field引數來過濾基本查詢集。

可以重寫以提供更復雜的行為,例如基於多個URL kwarg的物件查詢。

例如:

def get_object(self):
    queryset = self.get_queryset()
    filter = {}
    for field in self.multiple_lookup_fields:
        filter[field] = self.kwargs[field]

    obj = get_object_or_404(queryset, **filter)
    self.check_object_permissions(self.request, obj)
    return obj

請注意,如果您的API不包含任何物件級許可權,您可以選擇性地排除self.check_object_permissions,並簡單地從get_object_or_404查詢中返回該物件。

filter_queryset(self, queryset)
給定一個查詢集,使用正在使用的任何過濾後端過濾它,返回一個新的查詢集。

例如:

def filter_queryset(self, queryset):
    filter_backends = (CategoryFilter,)

    if 'geo_route' in self.request.query_params:
        filter_backends = (GeoRouteFilter, CategoryFilter)
    elif 'geo_point' in self.request.query_params:
        filter_backends = (GeoPointFilter, CategoryFilter)

    for backend in list(filter_backends):
        queryset = backend().filter_queryset(self.request, queryset, view=self)

    return queryset
get_serializer_class(self)

返回應該用於序列化程式的類。預設返回serializer_class屬性。

可以重寫以提供動態行為,例如使用不同的序列化程式進行讀寫操作,或者為不同型別的使用者提供不同的序列化程式。

例如:

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

儲存和刪除掛鉤:

mixin類提供了以下方法,並提供了物件儲存或刪除行為的輕鬆覆蓋。

perform_create(self, serializer)- CreateModelMixin儲存新物件例項時呼叫。
perform_update(self, serializer)- UpdateModelMixin儲存現有物件例項時呼叫。
perform_destroy(self, instance)- DestroyModelMixin刪除物件例項時呼叫。

這些掛鉤對於設定請求中隱含的屬性特別有用,但不是請求資料的一部分。例如,您可以根據請求使用者或基於URL關鍵字引數在物件上設定屬性。

def perform_create(self, serializer):
    serializer.save(user=self.request.user)

這些覆蓋點對於新增在儲存物件之前或之後發生的行為(例如通過電子郵件傳送確認或記錄更新)也特別有用。

def perform_update(self, serializer):
    instance = serializer.save()
    send_email_confirmation(user=self.request.user, modified=instance)

你也可以使用這些鉤子來提供額外的驗證,通過提高ValidationError()。如果您需要在資料庫儲存點應用某些驗證邏輯,這可能很有用。例如:

def perform_create(self, serializer):
    queryset = SignupRequest.objects.filter(user=self.request.user)
    if queryset.exists():
        raise ValidationError('You have already signed up')
    serializer.save(user=self.request.user)

注意:這些方法取代舊式的2.x版pre_save,post_save,pre_delete和post_delete方法,這將不再可用。

其他方法:

您通常不需要覆蓋以下方法,但如果您正在使用編寫自定義檢視,則可能需要呼叫它們GenericAPIView。

get_serializer_context(self) - 返回包含應提供給序列化程式的任何額外上下文的字典。預設為包括'request''view''format'鑰匙。
get_serializer(self, instance=None, data=None, many=False, partial=False) - 返回一個序列化程式例項。
get_paginated_response(self, data)- 返回分頁樣式Response物件。
paginate_queryset(self, queryset)- 如果需要,可以分頁查詢集,返回頁面物件,或者None如果沒有為此檢視配置分頁。
filter_queryset(self, queryset) - 給定一個查詢集,使用正在使用的過濾後端進行過濾,返回一個新的查詢集。

混入
mixin類提供用於提供基本檢視行為的操作。請注意,mixin類提供了操作方法,而不是直接定義處理程式方法,例如.get()和.post()。這允許更靈活的行為組合。

mixin類可以從中匯入rest_framework.mixins。

ListModelMixin
提供一種.list(request, *args, **kwargs)實現列出查詢集的方法。

如果填充了查詢集,則返回200 OK響應,並將查詢集的序列化表示形式作為響應的主體。可選地,可以對響應資料進行分頁。

CreateModelMixin
提供.create(request, *args, **kwargs)實現建立和儲存新模型例項的方法。

如果建立了一個物件,則返回一個201 Created響應,該物件的序列化表示形式作為響應的主體。如果表示包含名為的鍵url,則Location響應的標題將填充該值。

如果為建立物件而提供的請求資料無效,400 Bad Request則將返回響應,並將錯誤詳細資訊作為響應的主體。

RetrieveModelMixin
提供一種.retrieve(request, *args, **kwargs)方法,該方法實現在響應中返回現有模型例項。

如果可以檢索物件,則返回200 OK響應,並將物件的序列化表示作為響應的主體。否則它會返回一個404 Not Found。

UpdateModelMixin
提供.update(request, *args, **kwargs)實現更新和儲存現有模型例項的方法。

還提供了.partial_update(request, *args, **kwargs)一種類似於該update方法的方法,除了更新的所有欄位都是可選的。這允許支援HTTP PATCH請求。

如果更新了物件,則返回200 OK響應,並將物件的序列化表示作為響應的主體。

如果為更新物件而提供的請求資料無效,400 Bad Request則將返回響應,並將錯誤詳細資訊作為響應的主體。

DestroyModelMixin
提供一種.destroy(request, *args, **kwargs)實現刪除現有模型例項的方法。

如果刪除了一個物件,則返回一個204 No Content響應,否則返回一個404 Not Found。

具體檢視類
以下類是具體的通用檢視。如果您使用的是通用檢視,這通常是您將要工作的級別,除非您需要大量自定義的行為。

可以從中匯入檢視類rest_framework.generics。

CreateAPIView
用於僅建立端點。

提供post方法處理程式。

擴充套件:GenericAPIView,CreateModelMixin

ListAPIView
用於只讀端點以表示模型例項的集合。

提供get方法處理程式。

擴充套件:GenericAPIView,ListModelMixin

RetrieveAPIView
用於表示單個模型例項的只讀端點。

提供get方法處理程式。

擴充套件:GenericAPIView,RetrieveModelMixin

DestroyAPIView
用於單個模型例項的僅刪除端點。

提供delete方法處理程式。

擴充套件:GenericAPIView,DestroyModelMixin

UpdateAPIView
用於單個模型例項的僅更新端點。

提供put和patch方法處理程式。

擴充套件:GenericAPIView,UpdateModelMixin

ListCreateAPIView
用於讀寫端點以表示模型例項的集合。

提供get和post方法處理程式。

擴充套件:GenericAPIView,ListModelMixin,CreateModelMixin

RetrieveUpdateAPIView
用於讀取或更新端點以表示單個模型例項。

提供get,put並且patch方法處理。

擴充套件:GenericAPIView,RetrieveModelMixin,UpdateModelMixin

RetrieveDestroyAPIView
用於讀取或刪除端點以表示單個模型例項。

提供get和delete方法處理程式。

擴充套件:GenericAPIView,RetrieveModelMixin,DestroyModelMixin

RetrieveUpdateDestroyAPIView
用於讀寫 - 刪除端點以表示單個模型例項。

提供get,put,patch和delete方法處理。

擴充套件:GenericAPIView,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin

自定義通用檢視
通常,您會希望使用現有的通用檢視,但使用一些略微自定義的行為。如果您發現自己在多個位置重複使用某些自定義行為,則可能需要將該行為重構為公共類,然後可以根據需要將其應用於任何檢視或檢視集。

建立自定義mixins
例如,如果您需要根據URL conf中的多個欄位查詢物件,則可以建立如下所示的mixin類:

class MultipleFieldLookupMixin(object):
    """
    Apply this mixin to any view or viewset to get multiple field filtering
    based on a `lookup_fields` attribute, instead of the default single field filtering.
    """
    def get_object(self):
        queryset = self.get_queryset() # Get the base queryset
        queryset = self.filter_queryset(queryset) # Apply any filter backends
        filter = {}
        for field in self.lookup_fields:
            if self.kwargs[field]: # Ignore empty fields.
                filter[field] = self.kwargs[field]
        obj = get_object_or_404(queryset, **filter) # Lookup the object
        self.check_object_permissions(self.request, obj)
        return obj

然後,只要您需要應用自定義行為,就可以將此mixin簡單地應用於檢視或檢視集。

class RetrieveUserView(MultipleFieldLookupMixin, generics.RetrieveAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    lookup_fields = ('account', 'username')

如果您需要使用自定義行為,則使用自定義mixins是一個不錯的選擇。

建立自定義基類
如果您在多個檢視中使用mixin,則可以更進一步,建立自己的一組基本檢視,然後可以在整個專案中使用。例如:

class BaseRetrieveView(MultipleFieldLookupMixin,generics.RetrieveAPIView):
    pass

class BaseRetrieveUpdateDestroyView(MultipleFieldLookupMixin,generics.RetrieveUpdateDestroyAPIView):
    pass

如果您的自定義行為始終需要在整個專案中的大量檢視中重複,那麼使用自定義基類是一個不錯的選擇。

PUT為創造
在3.0版之前,REST框架mixin被PUT視為更新或建立操作,具體取決於物件是否已存在。

允許PUT作為建立操作是有問題的,因為它必然暴露有關物件的存在或不存在的資訊。透明地允許重新建立先前刪除的例項並不一定是比簡單地返回404響應更好的預設行為。

兩種樣式“ PUTas 404”和“ PUTas create”在不同情況下都可以有效,但從版本3.0開始,我們現在使用404行為作為預設值,因為它更簡單,更明顯。

如果需要通用PUT,為建立行為,你可能要包括像這個AllowPUTAsCreateMixin類的混入你的意見。

第三方包
以下第三方包提供了其他通用檢視實現。

Django REST框架批量
在Django的REST的架構,散包實現通用檢視混入以及一些普通混凝土通用檢視允許通過API請求應用批量操作。

Django休息多個模型
Django Rest Multiple Models提供了一個通用檢視(和mixin),用於通過單個API請求傳送多個序列化模型和/或查詢集。