sách gpt4 ăn đã đi

[Djangodrf] Lớp khung nhìn năm lớp APIView đóng gói tệp cấu hình drf thuộc tính lớp của ApiView

In lại Tác giả: Tôi là chú chim nhỏ Thời gian cập nhật: 2023-02-04 22:31:18 26 4
mua khóa gpt4 giày nike

Mục lục
  • Thuộc tính lớp ApiView
    • thứ tự tìm kiếm tập tin cấu hình drf
  • yêu cầu drf
    • Cấu hình liên quan đến yêu cầu APIView
  • phản hồi drf
    • Cấu hình liên quan đến phản hồi APIView
    • Thuộc tính đối tượng phản hồi
  • Viết 5 giao diện dựa trên APIView + ModelSerializer
    • Xem lớp học
    • Lớp tuần tự hóa
    • lộ trình
  • Viết năm giao diện dựa trên GenericAPIview
    • Các cài đặt cần thiết cho GenericAPIview
    • Tìm kiếm tất cả
      • lấy_truy_cập()
      • lấy_trình_hóa_tuần_tuần()
      • lấy_lớp_serializer()
    • Truy vấn một
      • lấy_đối_tượng()
      • thuộc tính lookup_field
      • bộ lọc_truy vấn()
    • Thêm một cái mới
    • Sửa đổi một
    • xóa một
    • Các thuộc tính lớp GenericAPIview khác
      • Cài đặt cơ bản
      • Tập tin cấu hình liên quan
  • Viết năm giao diện dựa trên GenericAPIView + 5 lớp mở rộng chế độ xem
    • Tìm kiếm tất cả
    • Truy vấn một
    • Thư từ
  • Kế thừa lớp xem cụ thể và viết năm giao diện
  • Sử dụng ModelViewSet để viết năm giao diện
  • thẩm quyền giải quyết

Thuộc tính lớp ApiView

Sau đây là tất cả các thuộc tính lớp của ApiView. Chúng tôi trích xuất một số thuộc tính để giới thiệu: Có thể thấy rằng các thuộc tính lớp này đều là cấu hình mặc định bằng tệp cấu hình drf.

Các chính sách sau có thể được đặt trên toàn cầu hoặc cho mỗi lớp chế độ xem. Cho phép đưa phần phụ thuộc vào các tệp cài đặt khác, thuộc tính lớp cài đặt của mã nguồn ApiView giúp việc kiểm tra dễ dàng hơn (nghĩa là không cần sử dụng api_settings của drf).

hình ảnh-20230204162954141
  • lớp kết xuất : Được sử dụng để đặt định dạng phản hồi của lớp xem. Theo mặc định, có hai định dạng phản hồi, một là chuỗi json phản hồi và hai là phản hồi cho trình duyệt.
  • lớp phân tích cú pháp : Được sử dụng để xác định định dạng yêu cầu mà lớp khung nhìn có thể phân tích cú pháp. Theo mặc định, 3 lớp phân tích cú pháp được sử dụng để phân tích cú pháp và các loại phương tiện sau có thể được phân tích cú pháp: nhiều phần/dữ liệu biểu mẫu ứng dụng/x-www-form-urlencoded ứng dụng/json
  • lớp xác thực : Cấu hình liên quan đến xác thực
  • lớp_ga_bướm : Cấu hình liên quan đến lớp tần số
  • lớp_quyền : Cấu hình liên quan đến lớp quyền

ôn tập:

                        
                          # Sự khác biệt giữa APIView và Chế độ xem trước đó - đối tượng Yêu cầu của khung REST được truyền vào phương thức xem, không phải đối tượng HttpRequeset của Django - phương thức xem có thể trả về đối tượng Phản hồi của khung REST - - mọi ngoại lệ APIException sẽ bị bắt và xử lý nó thành thông tin phản hồi thích hợp; - Trước khi phân phối Clark(), yêu cầu sẽ được xác thực, kiểm tra quyền và kiểm soát luồng.

                        
                      

thứ tự tìm kiếm tập tin cấu hình drf

Cấu hình mặc định của tệp cấu hình drf được sử dụng trong apiView. Sau đây là thứ tự tìm kiếm được cấu hình.

                        
                          Phương pháp ba: Thứ tự tìm kiếm (thường chỉ sử dụng thứ tự tích hợp sẵn) 1. Xem lớp (cấu hình cục bộ) 2. cài đặt django (cấu hình chung) 3. drf api_settings (cấu hình tích hợp) Lưu ý: Sử dụng cấu hình của renderer_classes trong xem lớp trước, tiếp theo là Sử dụng cấu hình trong cài đặt tệp cấu hình dự án django và cuối cùng sử dụng cấu hình api_settings tích hợp của drf


                        
                      

Trong cài đặt Django, nó phải được viết theo định dạng sau:

                        
                          REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': [ # Phản hồi cấu hình 'rest_framework.renderers.JSONRenderer', 'rest_framework.renderers.TemplateHTMLRenderer', ], 'DEFAULT_PARSER_CLASSES': [ # Yêu cầu cấu hình 'rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser', 'rest_framework.parsers.MultiPartParser', ], } # Lưu ý: Tất cả các cấu hình được viết trong REST_FRAMEWORK!

                        
                      

yêu cầu drf

Cấu hình liên quan đến yêu cầu APIView

                        
                          # Tại sao chúng ta cần cấu hình cấu hình liên quan đến yêu cầu? Một số CBV có thể được tùy chỉnh để chỉ chấp nhận định dạng json và không thể chấp nhận các định dạng khác. Tức là để tùy chỉnh định dạng mã hóa mà giao diện có thể chấp nhận. # Theo mặc định, json request.data tải lên giao diện người dùng chứa ---> từ điển python và urlencode\formdata request.data tải lên giao diện người dùng chứa ---> QueryDict # Phương thức 1, trong lớp xem được kế thừa từ APIView và các lớp con của nó Cấu hình (cấu hình cục bộ) # Tổng cộng có ba: từ Rest_framework.parsers nhập JSONParser, FormParser, MultiPartParser class BookView(APIView): parser_classes = [JSONParser,] # Cách 2: Cấu hình trong file cấu hình (ảnh hưởng đến tất cả, cấu hình toàn cục) -Django có một bộ cấu hình mặc định, và mỗi dự án có một cấu hình -drf có một bộ cấu hình mặc định, và mỗi dự án cũng có một cấu hình---》 Chỉ trong tệp cấu hình django REST_FRAMEWORK = { 'DEFAULT_PARSER_CLASSES': [ # 'rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser', # 'rest_framework.parsers.MultiPartParser', ], } # Phương pháp ba: Một được định cấu hình trên toàn cầu, nhưng một lớp chế độ xem nhất định muốn có ba. Cách định cấu hình nó? - Bạn chỉ cần cấu hình 3 trong lớp view - bởi vì: đầu tiên tìm kiếm từ chính lớp view, nếu không tìm thấy thì vào cấu hình drf của dự án để tìm, còn nếu không tìm thấy , hãy đi đến cấu hình mặc định của drf và tìm nó # trong yêu cầu phương thức lớp xem -data -__getattr__ -query_params

                        
                      

phản hồi drf

Cấu hình liên quan đến phản hồi APIView

                        
                          # Tại sao chúng ta cần thiết lập cấu hình liên quan đến phản hồi trong CBV? Bởi vì đối với phản hồi của drf, nếu bạn sử dụng trình duyệt và người đưa thư để truy cập vào cùng một giao diện, định dạng được phản hồi trả về sẽ khác - drf đưa ra phán đoán nếu là trình duyệt thì sẽ trông đẹp hơn. cần dữ liệu json. # Phương pháp 1: Viết trong lớp xem (cấu hình cục bộ) -Hai lớp phản hồi---》Tìm---》Tìm trong tệp cấu hình của drf--》Hai lớp-từ nhập Rest_framework.renderers JSONRenderer,BrowsableAPIRenderer class BookView(APIView): renderer_classes=[JSONRenderer,] # Cách 2: Ghi vào file cấu hình dự án (cấu hình toàn cục) REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': [ 'rest_framework.renderers.JSONRenderer', 'rest_framework.renderers. Có thể duyệtAPIRenderer', ], } # Phương pháp 3: Thứ tự sử dụng (thường chỉ sử dụng cái có sẵn) 1. renderer_classes 2. cài đặt django 3. drf api_settings Lưu ý: Ưu tiên cấu hình của renderer_classes trong lớp xem, sau đó sử dụng cấu hình trong cài đặt của dự án django tệp cấu hình và cuối cùng sử dụng drf Cấu hình của api_settings tích hợp

                        
                      

Thuộc tính đối tượng phản hồi

                        
                          # Phân tích mã nguồn phản hồi của drf - từ Rest_framework.response import Phản hồi - Khi phương thức của lớp khung nhìn trả về, hãy chạy lại Phản hồi, đi qua __init__ của nó, những tham số nào có thể được truyền trong init - Phản hồi cuối cùng kế thừa httpresponse. được chuyển vào init def __init__(self, data=None, status=None, template_name=None, headers=None, ngoại lệ=False, content_type=None) -data: Ser.data chúng ta đã viết trước đây có thể là từ điển hoặc danh sách, một chuỗi---》Quay lại giao diện người dùng sau khi tuần tự hóa---》Đây là những gì giao diện người dùng nhìn thấy trong nội dung phản hồi -status: http Mã trạng thái của phản hồi, mặc định là 200, bạn có thể thay đổi -drf trong gói trạng thái để ghi tất cả mã trạng thái phản hồi http, hằng số -from Rest_framework.status import HTTP_200_OK -Response('dddd',status=status.HTTP_200_OK) -template_name: Chỉ cần hiểu nó, sửa đổi mẫu phản hồi, BrowsableAPIRenderer được xác định và công ty có thể tùy chỉnh nó sau -headers: Tiêu đề phản hồi, ví dụ về tiêu đề phản hồi của phản hồi http: header={'xxx':'yyy'} -content_type: định dạng mã hóa phản hồi, nhìn chung không thay đổi # Tiêu điểm: dữ liệu, trạng thái, tiêu đề # Djagno gốc, cách thêm nội dung nào đó vào tiêu đề phản hồi? ''' Bộ bốn phần kết xuất, chuyển hướng, phương thức HttpResponse, JsonResponse: tạo HttpResponse và sau đó thêm thuộc tính''' # Ví dụ: obj = HttpResponse('dddd') obj['xxc'] = 'yyc' return obj Thêm thuộc tính tới tiêu đề phản hồi Kiến thức liên quan ---> Tên miền chéo 

                        
                      

Phản hồi drf cung cấp nhiều mã trạng thái:

Viết tất cả các mã trạng thái trong trạng thái:

Viết 5 giao diện dựa trên APIView + ModelSerializer

Xem lớp học

                        
                          từ .models nhập Sách từ .serializer nhập Lớp BookSerializer BookView(APIView): def get(self, request): books = Book.objects.all() ser = BookSerializer(instance=books, many=True) trả về Phản hồi(ser. data) def post(self, request): ser = BookSerializer(data=request.data) if ser.is_valid(): ser.save() # Bây giờ chúng tôi chỉ có các đối tượng của lớp tuần tự hóa ser, nhưng chúng tôi muốn thêm các đối tượng mới---"Nối tiếp vào từ điển---" Tiền đề chính là phương thức tạo trong lớp tuần tự hóa phải trả về đối tượng mới return Response( { 'code': 100, 'msg': 'Thêm thành công', 'result': ser.data}) else: return Response({'code': 101, 'msg': ser.errors}) class BookDetailView(APIView): def get(self, request, pk): books = Book.objects.filter(pk=pk).first() ser = BookSerializer(instance=books) return Response(ser.data) def put(self , yêu cầu, pk): books = Book.objects.filter(pk=pk).first() ser = BookSerializer(instance=books, data=request.data) if ser.is_valid(): ser.save() return Phản hồi({'code': 100, 'msg': 'Sửa đổi thành công', 'result': ser.data}) else: return Phản hồi({'code': 101 , 'msg': ser.errors}) def delete(self, request, pk): Book.objects.filter(pk=pk).delete() return Response({'code': 100, 'tin nhắn': 'Xóa thành công'})

                        
                      

Lớp tuần tự hóa

                        
                          ### Sử dụng ModelSerializer class BookSerializer(serializers.ModelSerializer): # Kiểm tra tất cả các trường class Meta: model = Book fields = ['name', 'price', 'publish_detail', 'author_list', 'publish', 'authors'] extra_kwargs = {'name': {'max_length': 8}, 'publish_detail': {'read_only': True}, 'author_list': {'read_only': True}, 'publish': {'write_only': True}, 'authors': {'write_only': True}, }

                        
                      

lộ trình

                        
                          urlpatterns = [ đường dẫn ('admin/', admin.site.urls), đường dẫn ('books/', views.BookView.as_view()), đường dẫn ('books//', views.BookDetailView.as_view()), ]

                        
                      

Viết năm giao diện dựa trên GenericAPIview

Nếu bạn cần viết thêm năm giao diện về tác giả ----> Bạn cần viết một CBV khác. Nhưng sự khác biệt giữa hai CBV này chỉ là mô hình bảng và lớp tuần tự hóa được sử dụng là khác nhau, còn lại là các mã lặp lại. Đây không phải là rắc rối sao? Mã có thể được tối ưu hóa thông qua tính kế thừa không? Vì vậy, tôi đã viết GenericAPIview -- kế thừa từ --> APIView. Trong tương lai, tôi có thể viết 5 giao diện dựa trên lớp này.

Các cài đặt cần thiết cho GenericAPIview

hình ảnh-20230203114428183

Nếu muốn sử dụng GenericAPIview, bạn cần chọn một trong hai tùy chọn sau:

  1. Đặt các thuộc tính sau trong lớp xem (thường được sử dụng).

    bộ truy vấn 、 lớp tuần tự hóa 。

  2. Ghi đè các phương thức get_queryset() / get_serializer_class() của lớp GenericAPIview.

Nếu bạn ghi đè một phương thức xem, điều quan trọng là bạn gọi get_queryset() thay vì truy cập trực tiếp vào thuộc tính bộ truy vấn. Bởi vì bộ truy vấn sẽ chỉ được đặt một lần và kết quả sẽ được lưu vào bộ đệm cho tất cả các yêu cầu tiếp theo.

Nói chung, không truy cập trực tiếp vào các thuộc tính queryset và serializer_class mà hãy sử dụng các phương thức khác nhau do GenericAPIview cung cấp để lấy chúng.

Tìm kiếm tất cả

hình ảnh-20230204145645336

                        
                          # Đầu tiên chỉ định đối tượng mô hình và lớp tuần tự hóa class BookView(GenericAPIView): queryset = Book.objects.all() # queryset = Book.objects Điều này cũng khả thi serializer_class = BookSerializer # Các mã sau đây tương đương objs = Book.objects .all () objs = self.get_queryset() # Các mã sau đây tương đương với ser = self.get_serializer(instance=objs, many=True) BookSerializer(instance=objs, many=True)

                        
                      

lấy_truy_cập()

hình ảnh-20230203173342133

Phương thức get_queryset lấy đối tượng danh sách trong dạng xem! Đối tượng danh sách này phải là một đối tượng có thể lặp lại hoặc một bộ truy vấn.

Theo mặc định, self.queryset được sử dụng để lấy (liệt kê các đối tượng trong dạng xem):

hình ảnh-20230203202821381

Phương thức này phải luôn được sử dụng để truy xuất thay vì gọi trực tiếp self.queryset.

Mã nguồn get_queryset làm gì?

  1. Nếu thuộc tính bộ truy vấn không được ghi trong lớp khung nhìn và sau đó get_queryset được gọi thì một ngoại lệ sẽ được đưa ra.
  2. Lấy thuộc tính bộ truy vấn mà chúng ta đã đặt. Nếu đó là đối tượng Bộ truy vấn, hãy gọi phương thức all() và cuối cùng trả về thuộc tính lớp bộ truy vấn mà chúng ta đã đặt.

lấy_trình_hóa_tuần_tuần()

hình ảnh-20230203201429473

Sử dụng phương thức get_serializer() để trả về một phiên bản của bộ tuần tự hóa được sử dụng để xác thực và giải tuần tự hóa đầu vào giao diện người dùng cũng như tuần tự hóa đầu ra phía sau.

Mã nguồn get_serializer làm gì?

  1. Lớp tuần tự hóa mà chúng tôi đã chỉ định trong lớp khung nhìn được lấy thông qua phương thức get_serializer_class.

  2. Đã thêm tham số 'ngữ cảnh' để chuyển vào lớp tuần tự hóa của chúng tôi.

    Tương đương với BookSerializer(instance=objs, many=True, context={some data...}).

hình ảnh-20230203202858354

lấy_lớp_serializer()

Phương thức get_serializer_class về cơ bản không làm gì cả và trả về trực tiếp serializer. Bạn có thể ghi đè get_serializer_class nếu cần. Có thể nhận ra: các giao diện khác nhau sử dụng các lớp tuần tự hóa khác nhau. Việc tuần tự hóa sử dụng một lớp tuần tự hóa nhất định và việc giải tuần tự hóa sử dụng một lớp tuần tự hóa khác.

hình ảnh-20230203203043304

Viết lại:

hình ảnh-20230203224942685

Truy vấn một

hình ảnh-20230203212916443

Ở đây, đối tượng mô hình tương ứng sẽ được truy vấn dựa trên tham số pk đến. Thông thường, để viết giao diện truy vấn, chúng ta cần viết ORM theo cách thủ công (chẳng hạn như Book.objects.filter(pk=pk)) để tìm đối tượng dựa trên. trên khóa chính. Vì GenericAPIview được sử dụng ở đây nên nó sẽ tự động kiểm tra cho chúng ta.

lấy_đối_tượng()

Đối tượng mô hình được truy vấn thông qua tham số pk và phương thức get_object.

Trả về phiên bản đối tượng được áp dụng cho chế độ xem chi tiết. Theo mặc định, bộ truy vấn cơ bản được lọc bằng tham số lookup_field. Phương pháp này có thể được ghi đè để cung cấp hành vi phức tạp hơn, chẳng hạn như tra cứu đối tượng dựa trên nhiều tham số URL.

thuộc tính lookup_field

hình ảnh-20230203202258635

Nếu bạn muốn sử dụng phương pháp tra cứu đối tượng khác với pk, bạn có thể đặt lookup_field. Nếu bạn có yêu cầu tìm kiếm phức tạp hơn, bạn có thể ghi đè get_object().

Một ví dụ được đưa ra dưới đây:

Sửa đổi điều kiện truy vấn thành tên sách:

hình ảnh-20230203214630826

bộ lọc_truy vấn()

hình ảnh-20230204141418521

Có thể thấy rằng trong phương thức get_object, get_queryset() được gọi để lấy bộ truy vấn mà chúng ta đã đặt trong dạng xem, sau đó filter_queryset() được sử dụng để lọc bộ truy vấn mà chúng ta thu được từ cơ sở dữ liệu.

hình ảnh-20230204142438060

Lời giải thích về filter_queryset là: Cung cấp cho nó một bộ truy vấn và nó sẽ sử dụng bất kỳ bộ lọc phụ trợ nào bạn đang sử dụng để lọc.

self.filter_backends: Vì không có cấu hình nào trong lớp của chúng ta nên nó sẽ trỏ đến filter_backends trong lớp GenericAPIview.

Bộ lọc mặc định được chỉ định trong tệp cấu hình drf được sử dụng theo mặc định trong lớp GenericAPIview.

Sau đó, trong tệp cấu hình drf, mặc định là không lọc:

Nói chung, mặc định là không lọc, nhưng chúng ta có thể chỉ định các bộ lọc bằng cách viết thuộc tính filter_backends trong lớp xem của mình.

Thêm một cái mới

                        
                              def post(self, request): ser = self.get_serializer(data=request.data) if ser.is_valid(): ser.save() return Response({'code': 100, 'msg': 'Tin nhắn không hợp lệ', 'result': ser.data}) else: return Response({'code': 101, 'msg': ser.errors})

                        
                      

Sửa đổi một

                        
                           def put(self, request, pk): obj = self.get_object() ser = self.get_serializer(instance=obj, data=request.data) if ser.is_valid(): ser.save() return Response({'code': 100, 'msg': 'Đã gửi yêu cầu', 'result': ser.data}) else: return Response({'code': 101, 'msg': ser.errors})

                        
                      

xóa một

                        
                            def delete(self, request, pk): obj = self.get_object() obj.delete() return Response({'code': 100, 'msg': 'Không thể xóa'})

                        
                      

Các thuộc tính lớp GenericAPIview khác

Cài đặt cơ bản

  • truy vấn - Tập kết quả truy vấn được sử dụng để trả về các đối tượng từ một khung nhìn. Thông thường, bạn phải đặt thuộc tính này hoặc ghi đè lấy_truy_cập() phương pháp. Nếu bạn ghi đè một phương thức xem, điều quan trọng là bạn phải gọi lấy_truy_cập() phương thức thay vì truy cập trực tiếp vào thuộc tính vì truy vấn Sẽ được tính một lần và kết quả sẽ được lưu vào bộ nhớ đệm cho các yêu cầu tiếp theo.
  • lớp tuần tự hóa - Lớp trình tuần tự hóa để xác thực và giải tuần tự hóa đầu vào cũng như để tuần tự hóa đầu ra. Thông thường, bạn phải đặt thuộc tính này hoặc ghi đè lấy_lớp_serializer() phương pháp.
  • trường_tra_cứu - Các trường mô hình được sử dụng để thực hiện tra cứu đối tượng cho các phiên bản mô hình riêng lẻ. Mặc định là 'vui' . Xin lưu ý rằng khi sử dụng API siêu liên kết, nếu bạn cần sử dụng một giá trị tùy chỉnh, bạn cần đảm bảo rằng trong chế độ xem API Lớp tuần tự hóa Tất cả Đặt trường tìm kiếm.
  • tra cứu_url_kwarg - Đối số từ khóa URL được áp dụng để tra cứu đối tượng. Cấu hình URL của nó phải bao gồm đối số từ khóa tương ứng với giá trị này. Nếu không được đặt, mặc định là sử dụng tương tự trường_tra_cứu cùng một giá trị.

Tập tin cấu hình liên quan

Các thuộc tính sau đây được sử dụng để kiểm soát phân trang khi sử dụng với chế độ xem danh sách.

  • pagination_class - Lớp phân trang nên được sử dụng khi liệt kê kết quả phân trang. Giá trị mặc định giống với cài đặt DEFAULT_PAGINATION_CLASS, đó là 'rest_framework.pagination.PageNumberPagination'.

  • filter_backends - Danh sách các lớp phụ trợ bộ lọc được sử dụng để lọc bộ truy vấn. Giá trị mặc định giống với cài đặt DEFAULT_FILTER_BACKENDS.

Viết năm giao diện dựa trên GenericAPIView + 5 lớp mở rộng chế độ xem

Mặc dù lớp GenericAPIview được sử dụng để viết năm giao diện, nhưng mã được viết vẫn còn quá nhiều và mã không bị giảm! Các phương thức get, post, put và xóa trong lớp CBV đều có mã trùng lặp. Có thể tối ưu hóa chúng không?

Tác giả của drf đương nhiên đã nghĩ đến điều này. Ông đã cung cấp 5 lớp mở rộng khung nhìn để giúp chúng ta viết phần mã này! Đầu tiên nhập năm lớp mở rộng chế độ xem:

                        
                          từ rest_framework.mixins nhập ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin, RetrieveModelMixin

                        
                      

Tìm kiếm tất cả

                        
                          lớp BookView(GenericAPIView, ListModelMixin): queryset = Book.objects serializer_class = BookSerializer def get(self, request): return self.list(request)

                        
                      

Bây giờ bạn chỉ cần sử dụng self.list để gọi mã được viết trong lớp ListModeMixin:

Tương tự như những gì chúng ta đã viết trước đây, trước tiên chúng ta lấy bộ truy vấn rồi chuyển nó vào lớp tuần tự hóa. Các hoạt động lọc và phân trang cũng được thực hiện ở giữa.

Truy vấn một

                        
                          lớp BookDetailView(GenericAPIView, RetrieveModelMixin): queryset = Book.objects serializer_class = BookSerializer def get(self, request, pk): # Không thể lấy được pk return self.retrieve(request)

                        
                      

Thư từ

Bằng cách này, năm giao diện có thể được triển khai rất thuận tiện. Chúng ta chỉ cần biết sự tương ứng trực tiếp giữa các phương thức.

                        
                          ListModelMixin --> list --> Truy vấn tất cả RetrieveModelMixin --> truy xuất --> Truy vấn CreateModelMixin --> tạo --> Thêm UpdateModelMixin --> cập nhật --> Sửa đổi DestroyModelMixin --> hủy --> Xóa một

                        
                      

Mã số:

                        
                          lớp BookView(GenericAPIView, ListModelMixin, CreateModelMixin): queryset = Book.objects serializer_class = BookSerializer def get(self, request): return self.list(request) def post(self, request): return self.create(request) lớp BookDetailView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin): queryset = Book.objects serializer_class = BookSerializer def get(self, request, pk): return self.retrieve(request) def put(self, request, pk): return self.update(request) def delete(self, request, pk): return self.destroy(request)

                        
                      

Mặc dù mã đã được đơn giản hóa nhưng vẫn có những phần lặp lại như các phương thức yêu cầu này sẽ được gói gọn sau.

Kế thừa lớp xem cụ thể và viết năm giao diện

Lớp xem cụ thể là gì? Các Lớp View cụ thể, tức là tác giả của drf đã giúp bạn viết tất cả các mã giao diện mà CBV cần viết và đóng gói chúng thành các lớp. Bạn chỉ cần kế thừa trực tiếp các lớp này và lớp view của bạn sẽ có giao diện tương ứng. phải không? Rất kỳ diệu~~.

drf cung cấp các lớp xem cụ thể sau:

hình ảnh-20230204154227345

LƯU Ý: Không có DestroyUpdateAPIView.

Đi thẳng vào mã:

                        
                          từ Rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView class BookView(ListCreateAPIView): # Truy vấn tất cả các bổ sung mới queryset = Book.objects serializer_class = BookSerializer class BookDetailView(RetrieveUpdateDestroyAPIView): # Truy vấn một sửa đổi và một xóa bộ truy vấn = Book.objects serializer_class = BookSerializer
    

                        
                      

Sử dụng ModelViewSet để viết năm giao diện

Lý do tại sao trước đây chúng tôi sử dụng hai CBV để viết năm giao diện là: truy vấn một và truy vấn tất cả đều sử dụng yêu cầu get. Để hiểu được sự ghép nối và tránh viết quá nhiều mã trong phương thức get trong lớp, chúng tôi chia nó thành hai CBV. .

Sử dụng ModelViewSet có thể đạt được điều đó, một lớp khung nhìn ghi 5 giao diện.

                        
                          từ rest_framework.viewsets nhập ModelViewSet lớp BookView(ModelViewSet): queryset = Book.objects serializer_class = BookSerializer

                        
                      

thẩm quyền giải quyết

  • Trang chủ - Trang web Trung Quốc Django REST framework (q1mi.github.io)

Cuối cùng, bài viết này về cách đóng gói năm lớp của lớp APIView đối với tệp cấu hình drf thuộc tính lớp của ApiView sẽ kết thúc tại đây. Nếu bạn muốn biết thêm về cách đóng gói năm lớp của lớp APIView đối với các thuộc tính lớp của ApiView. file cấu hình drf, vui lòng tìm kiếm các bài viết về CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .

26 4 0
tôi là một con chim nhỏ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress