Các lớp mở rộng sau đây cung cấp các phương thức xử lý chuẩn cho các thao tác CRUD trên dữ liệu, giúp giảm thiểu việc viết mã bằng cách kế thừa trực tiếp. Các lớp mở rộng này cần kết hợp với lớp cha GenericAPIView vì chúng phụ thuộc vào các phương thức xử lý bộ chuyển đổi dữ liệu và truy vấn cơ sở dữ liệu được cung cấp bởi GenericAPIView.
1) ListModelMixin
Lớp mở rộng xử lý danh sách, cung cấp phương thứclist để xử lý yêu cầu trả về danh sách dữ liệu, trả về trạng thái 200. Phương thức này tự động áp dụng bộ lọc và phân trang dữ liệu.class ListModelMixin(object):
def list(self, request, *args, **kwargs):
dataset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(dataset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(dataset, many=True)
return Response(serializer.data)Ví dụ sử dụng:from rest_framework.mixins import ListModelMixin
class BookListHandler(ListModelMixin, GenericAPIView):
dataset = BookInfo.objects.all()
serializer_config = BookInfoSerializer
def get(self, request):
return self.list(request)2) CreateModelMixin
Lớp mở rộng xử lý tạo mới, cung cấp phương thứccreate để xử lý yêu cầu tạo tài nguyên mới, trả về trạng thái 201. Nếu bộ chuyển đổi dữ liệu không xác thực được dữ liệu đầu vào, trả về trạng thái 400.class CreateModelMixin(object):
def create(self, request, *args, **kwargs):
data_serializer = self.get_serializer(data=request.data)
data_serializer.is_valid(raise_exception=True)
self.perform_save(data_serializer)
headers = self.get_success_headers(data_serializer.data)
return Response(data_serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def perform_save(self, serializer):
serializer.save()
def get_success_headers(self, data):
try:
return {'Location': str(data[api_settings.URL_FIELD_NAME])}
except (TypeError, KeyError):
return {}3) RetrieveModelMixin
Lớp mở rộng xử lý chi tiết, cung cấp phương thứcretrieve để trả về một đối tượng dữ liệu tồn tại, trả về trạng thái 200 nếu tìm thấy, 404 nếu không tồn tại.class RetrieveModelMixin(object):
def retrieve(self, request, *args, **kwargs):
target_object = self.get_object()
serializer = self.get_serializer(target_object)
return Response(serializer.data)Ví dụ sử dụng:class BookDetailHandler(RetrieveModelMixin, GenericAPIView):
dataset = BookInfo.objects.all()
serializer_config = BookInfoSerializer
def get(self, request, pk):
return self.retrieve(request)4) UpdateModelMixin
Lớp mở rộng xử lý cập nhật, cung cấp phương thứcupdate để cập nhật toàn bộ dữ liệu và partial_update để cập nhật từng phần. Trả về trạng thái 200 nếu thành công, 400 nếu xác thực thất bại.class UpdateModelMixin(object):
def update(self, request, *args, **kwargs):
is_partial_update = kwargs.pop('partial', False)
target_object = self.get_object()
serializer = self.get_serializer(target_object, data=request.data, partial=is_partial_update)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
if getattr(target_object, '_prefetched_objects_cache', None):
target_object._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)5) DestroyModelMixin
Lớp mở rộng xử lý xóa, cung cấp phương thứcdestroy để xóa một đối tượng dữ liệu tồn tại, trả về trạng thái 204 nếu thành công, 404 nếu không tồn tại.class DestroyModelMixin(object):
def destroy(self, request, *args, **kwargs):
target_record = self.get_object()
self.perform_delete(target_record)
return Response(status=status.HTTP_204_NO_CONTENT)
def perform_delete(self, instance):
instance.delete()