Năm Lớp Mở Rộng Xử Lý Truy Vấn Trong Django REST Framework

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ức list để 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ức create để 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ức retrieve để 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ức update để 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ức destroy để 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()

Thẻ: Django REST Framework GenericAPIView ModelMixins pagination

Đăng vào ngày 2 tháng 9 lúc 13:32