Djangoのビュー拡張クラス
拡張したクラスでなければなりませんGenericAPIView
シリアライザを呼び出すときに、拡張内部クラスを使用して使用していますget_serializer
カスタマイズする必要がありget
、post
内部実装は、クラスを拡張するために、対応するメソッドを呼び出し、およびその他の要求方法。
、ミックスインビューサブクラス
役割:
それはあなたが意見を記述する必要がある場合、私が書いたコードを減らす、あなたが相続対応する拡張クラスを介してコードの再利用を表示することができ、これらの5つに属し、処理フローを実現するために(データリソースの削除が確認された)いくつかのバックエンドのビューを提供します量。
5は一致させる必要性によって拡張GenericAPIView
5つの拡張クラスの実現を呼び出す必要があるので、親クラスをGenericAPIView
提供するデータベースクエリの配列と方法を。
1.1 ListModelMixin
拡張クラスリストビューは、が提供されるlist(request, *args, **kwargs)
迅速ビュー200の戻りステータスコードをリストする方法。
- 提供する
list
簡単なリストビューを達成するための方法を - するために呼び出し
GenericAPIView
結果の良いセットを設定します - するために呼び出す
GenericAPIView
良いシリアライザを設定
すなわち、この方法は、データ及びページングをフィルタリングします。Mixin
list()
出典:
from rest_framework.mixins import ListModelMixin
class ListModelMixin(object):
"""
List a queryset.
"""
def list(self, request, *args, **kwargs):
# 过滤
queryset = self.filter_queryset(self.get_queryset())
# 分页
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
# 序列化
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
例えば:
from rest_framework.mixins import ListModelMixin
from rest_framework.generics import GenericAPIView
class BookListView(ListModelMixin, GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
def get(self, request):
return self.list(request)
1.2 CreateModelMixin
提供ビューの拡張クラスの作成create(request, *args, **kwargs)
迅速ビュー、成功リターン201ステータスコードを作成するためのリソースを実現する方法を。
- 提供
create(request, *args, **kwargs)
すばやくリソースビューの作成を達成するための方法を - 機能により作成された実際の配列
save
の完全な方法 save
メソッド呼び出しは、のシリアル化するために行くcreate
方法を
フロントエンドのデータ伝送の認証失敗の配列は、400エラーを返す場合。
出典:
from rest_framework.mixins import CreateModelMixin
class CreateModelMixin(object):
"""
Create a model instance.
"""
def create(self, request, *args, **kwargs):
# 获取序列化器
serializer = self.get_serializer(data=request.data)
# 验证
serializer.is_valid(raise_exception=True)
# 保存
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def perform_create(self, serializer):
serializer.save()
def get_success_headers(self, data):
try:
return {'Location': str(data[api_settings.URL_FIELD_NAME])}
except (TypeError, KeyError):
return {}
1.3 RetrieveModelMixin
拡張クラスの詳細図が提供されるretrieve(request, *args, **kwargs)
方法は、現在のデータ・オブジェクトに戻り迅速に実施することができます。
そうであれば、そうでない場合は404、200に戻ります。
出典:
from rest_framework.mixins import RetrieveModelMixin
class RetrieveModelMixin(object):
"""
Retrieve a model instance.
"""
def retrieve(self, request, *args, **kwargs):
# 获取对象,会检查对象的权限
instance = self.get_object()
# 序列化
serializer = self.get_serializer(instance)
return Response(serializer.data)
例えば:
from rest_framework.mixins import RetrieveModelMixin
from rest_framework.generics import GenericAPIView
class BookDetailView(RetrieveModelMixin, GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
def get(self, request, pk):
return self.retrieve(request)
1.4 UpdateModelMixin
更新ビューの拡張クラスが提供されているupdate(request, *args, **kwargs)
方法を
- 既存のデータ・オブジェクトを更新迅速に実装することができます。
- それはまた、提供する
partial_update(request, *args, **kwargs)
方法は、部分的な更新を実現することができます。 - 内部更新機能は、デシリアライザ呼び出す
save
方法を save
この方法は、シリアライザの呼び出すupdate
メソッドを
200成功したリターン、データシリアライザチェックが失敗し、400エラーを返します。
出典:
from rest_framework.mixins import UpdateModelMixin
class UpdateModelMixin(object):
"""
Update a model instance.
"""
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
if getattr(instance, '_prefetched_objects_cache', None):
# If 'prefetch_related' has been applied to a queryset, we need to
# forcibly invalidate the prefetch cache on the instance.
instance._prefetched_objects_cache = {}
return Response(serializer.data)
def perform_update(self, serializer):
serializer.save()
def partial_update(self, request, *args, **kwargs):
kwargs['partial'] = True
return self.update(request, *args, **kwargs)
1.5 DestroyModelMixin
ビューの拡張クラスが提供さ削除destroy(request, *args, **kwargs)
方法を、それはすぐに、既存のデータ・オブジェクトを削除するに実装することができます。
204の成功リターン、404ノーリターンがありません。
出典:
from rest_framework.mixins import DestroyModelMixin
class DestroyModelMixin(object):
"""
Destroy a model instance.
"""
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
self.perform_destroy(instance)
return Response(status=status.HTTP_204_NO_CONTENT)
def perform_destroy(self, instance):
instance.delete()
使用GenericAPIView
して実装し、拡張ビュークラスapi
のインターフェイスを、コード:
"""GenericAPIView结合视图扩展类实现api接口"""
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin,CreateModelMixin
class Students2GenericAPIView(GenericAPIView,ListModelMixin,CreateModelMixin):
# 本次视图类中要操作的数据[必填]
queryset = Student.objects.all()
# 本次视图类中要调用的默认序列化器[玄天]
serializer_class = StudentModelSerializer
def get(self, request):
"""获取多个学生信息"""
return self.list(request)
def post(self,request):
"""添加学生信息"""
return self.create(request)
from rest_framework.mixins import RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
from rest_framework.generics import GenericAPIView
class Student2GenericAPIView(GenericAPIView,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin):
queryset = Student.objects.all()
serializer_class = StudentModelSerializer
# 在使用GenericAPIView视图获取或操作单个数据时,视图方法中的代表主键的参数最好是pk
def get(self,request,pk):
"""获取一条数据"""
return self.retrieve(request,pk)
def put(self,request,pk):
"""更新一条数据"""
return self.update(request,pk)
def delete(self,request,pk):
"""删除一条数据"""
return self.destroy(request,pk)
二、ジェネリックビューサブクラス
2.1 CreateAPIView
提供post
方法を
:から継承されますGenericAPIView
`CreateModelMixin
2.2 ListAPIView
提供get
方法を
継承されてGenericAPIView
から:、ListModelMixin
2.3 RetrieveAPIView
提供get
方法を
継承されてGenericAPIView
から:、RetrieveModelMixin
2.4 DestoryAPIView
提供delete
方法を
継承されてGenericAPIView
から:、DestoryModelMixin
2.5 UpdateAPIView
提供put
およびpatch
方法
継承されてGenericAPIView
から:、UpdateModelMixin
2.6 RetrieveUpdateAPIView
提供get
、put
、patch
方法
継承されてGenericAPIView
から:RetrieveModelMixin
、、UpdateModelMixin
2.7 RetrieveUpdateDestoryAPIView
提供get
、put
、patch
、delete
方法
継承GenericAPIView
:からRetrieveModelMixin
、UpdateModelMixin
、、DestoryModelMixin