Professional Documents
Culture Documents
Chế Độ Xem Chung - Khung Công Tác Django REST
Chế Độ Xem Chung - Khung Công Tác Django REST
Ví dụ
Tham chiếu API
TạoAPIView
Danh sáchAPIView
Truy xuấtAPIView
Phá hủy chế độ xem API
Cập nhậtAPIView
Danh sáchTạoAPIView
Truy xuấtUpdateAPIView
Truy xuấtTiêu hủyAPIView
Truy xuấtCập nhậtTiêu hủyAPIView
Tùy chỉnh chế độ xem chung
generics.py mixins.py
“
Các chế độ xem chung của Django... được phát triển như một lối tắt cho các kiểu
sử dụng phổ biến... Chúng sử dụng một số thành ngữ và mẫu phổ biến nhất định
được tìm thấy trong quá trình phát triển chế độ xem và trừu tượng hóa chúng để
bạn có thể nhanh chóng viết các chế độ xem dữ liệu chung mà không cần phải
lặp lại.
- Tài liệu Django
Một trong những lợi ích chính của chế độ xem dựa trên lớp là cách chúng cho phép bạn tổng hợp các hành vi
có thể sử dụng lại. Khung REST tận dụng lợi thế này bằng cách cung cấp một số chế độ xem dựng sẵn cung
cấp các mẫu thường được sử dụng.
Các chế độ xem chung do khung REST cung cấp cho phép bạn nhanh chóng xây dựng các chế độ xem API
ánh xạ chặt chẽ với các mô hình cơ sở dữ liệu của bạn.
Nếu các chế độ xem chung không phù hợp với nhu cầu API của bạn, bạn có thể chuyển sang sử dụng
APIView lớp thông thường hoặc sử dụng lại các mixin và lớp cơ sở được các chế độ xem chung sử dụng để
soạn tập hợp các chế độ xem chung có thể sử dụng lại của riêng bạn.
Ví dụ
Thông thường khi sử dụng chế độ xem chung, bạn sẽ ghi đè chế độ xem và đặt một số thuộc tính lớp.
class UserList(generics.ListCreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = [IsAdminUser]
Đối với các trường hợp phức tạp hơn, bạn cũng có thể muốn ghi đè các phương thức khác nhau trên lớp
khung nhìn. Ví dụ.
class UserList(generics.ListCreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = [IsAdminUser]
Đối với những trường hợp rất đơn giản, bạn có thể muốn chuyển qua bất kỳ thuộc tính lớp nào bằng
.as_view() phương thức này. Ví dụ: URLconf của bạn có thể bao gồm nội dung nào đó giống như mục sau:
Mỗi chế độ xem chung cụ thể được cung cấp đều được xây dựng bằng cách kết hợp GenericAPIView với
một hoặc nhiều lớp mixin.
Thuộc tính
Các cài đặt cơ bản :
Các thuộc tính sau đây kiểm soát hành vi xem cơ bản.
queryset - Bộ truy vấn nên được sử dụng để trả về các đối tượng từ chế độ xem này. Thông thường, bạn
phải đặt thuộc tính này hoặc ghi đè get_queryset() phương thức. Nếu bạn đang ghi đè một phương
thức xem, điều quan trọng là bạn phải gọi get_queryset() thay vì truy cập trực tiếp vào thuộc tính này,
vì queryset nó sẽ được đánh giá một lần và những kết quả đó sẽ được lưu vào bộ đệm cho tất cả các
yêu cầu tiếp theo.
serializer_class - Lớp trình tuần tự hóa nên được sử dụng để 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 đè
get_serializer_class() phương thức.
lookup_field - Trường mô hình nên được sử dụng để thực hiện tra cứu đối tượng của các phiên bản
mô hình riêng lẻ. Mặc định là 'pk' . Lưu ý rằng khi sử dụng API siêu liên kết, bạn cần đảm bảo rằng cả
chế độ xem API và lớp trình tuần tự hóa đều đặt trường tra cứu nếu bạn cần sử dụng giá trị tùy chỉnh.
lookup_url_kwarg - Đối số từ khóa URL nên được sử dụng để tra cứu đối tượng. Cấu hình URL 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, giá trị mặc định này sẽ sử dụng
cùng giá trị với lookup_field .
Phân trang :
Các thuộc tính sau đượ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 phân trang kết quả danh sách. Mặc định có
cùng giá trị với DEFAULT_PAGINATION_CLASS cài đặt, đó là
'rest_framework.pagination.PageNumberPagination' . Cài đặt pagination_class=None sẽ vô
hiệu hóa phân trang trên chế độ xem này.
Lọc :
filter_backends - Danh sách các lớp phụ trợ bộ lọc nên được sử dụng để lọc bộ truy vấn. Mặc định có
cùng giá trị với DEFAULT_FILTER_BACKENDS cài đặt.
phương pháp
Các phương pháp cơ bản :
get_queryset(self)
Trả về bộ truy vấn sẽ được sử dụng cho chế độ xem danh sách và nên được sử dụng làm cơ sở để tra cứu
trong chế độ xem chi tiết. Mặc định trả về bộ truy vấn được chỉ định bởi queryset thuộc tính.
Phương pháp này phải luôn được sử dụng thay vì truy cập self.queryset trực tiếp, vì self.queryset chỉ
được đánh giá một lần và những kết quả đó được lưu vào bộ đệm cho tất cả các yêu cầu tiếp theo.
Có thể được ghi đè để cung cấp hành vi động, chẳng hạn như trả về một bộ truy vấn, dành riêng cho người
dùng đưa ra yêu cầu.
Ví dụ:
def get_queryset(self):
user = self.request.user
return user.accounts.all()
Lưu ý: Nếu serializer_class sử dụng trong chế độ xem chung mở rộng các mối quan hệ orm, dẫn đến
vấn đề n+1, bạn có thể tối ưu hóa bộ truy vấn của mình trong phương thức này bằng cách sử dụng
select_related và prefetch_related . Để biết thêm thông tin về vấn đề n+1 và trường hợp sử dụng của
các phương pháp được đề cập, hãy tham khảo phần liên quan trong tài liệu django .
get_object(self)
Trả về một phiên bản đối tượng nên được sử dụng để xem chi tiết. Mặc định sử dụng tham
lookup_field số để lọc bộ truy vấn cơ sở.
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 kwarg
URL.
Ví dụ:
def get_object(self):
queryset = self.get_queryset()
filter = {}
for field in self.multiple_lookup_fields:
filter[field] = self.kwargs[field]
Lưu ý rằng nếu API của bạn không bao gồm bất kỳ quyền cấp đối tượng nào, bạn có thể tùy ý loại trừ
self.check_object_permissions và chỉ cần trả về đối tượng từ get_object_or_404 tra cứu.
filter_queryset(self, queryset)
Đưa ra một bộ truy vấn, hãy lọc nó với bất kỳ phần phụ trợ bộ lọc nào đang được sử dụng, trả về một bộ truy
vấn mới.
Ví dụ:
if 'geo_route' in self.request.query_params:
filter_backends = [GeoRouteFilter, CategoryFilter]
elif 'geo_point' in self.request.query_params:
filter_backends = [GeoPointFilter, CategoryFilter]
return queryset
get_serializer_class(self)
Trả về lớp nên được sử dụng cho bộ tuần tự hóa. Mặc định trả về serializer_class thuộc tính.
Có thể được ghi đè để cung cấp hành vi động, chẳng hạn như sử dụng các bộ nối tiếp khác nhau cho các hoạt
động đọc và ghi hoặc cung cấp các bộ nối tiếp khác nhau cho các loại người dùng khác nhau.
Ví dụ:
def get_serializer_class(self):
if self.request.user.is_staff:
return FullAccountSerializer
return BasicAccountSerializer
Các phương thức sau đây được cung cấp bởi các lớp mixin và cung cấp khả năng ghi đè dễ dàng hành vi lưu
hoặc xóa đối tượng.
perform_create(self, serializer) - Được gọi CreateModelMixin khi lưu một thể hiện đối tượng
mới.
perform_update(self, serializer) - Được gọi UpdateModelMixin khi lưu một thể hiện đối tượng
hiện có.
perform_destroy(self, instance) - Được gọi DestroyModelMixin khi xóa một thể hiện đối tượng.
Những hook này đặc biệt hữu ích để thiết lập các thuộc tính tiềm ẩn trong yêu cầu nhưng không phải là một
phần của dữ liệu yêu cầu. Ví dụ: bạn có thể đặt thuộc tính trên đối tượng dựa trên người dùng yêu cầu hoặc
dựa trên đối số từ khóa URL.
Những điểm ghi đè này cũng đặc biệt hữu ích để thêm hành vi xảy ra trước hoặc sau khi lưu một đối tượng,
chẳng hạn như gửi email xác nhận hoặc ghi nhật ký cập nhật.
Bạn cũng có thể sử dụng các hook này để cung cấp xác thực bổ sung bằng cách tăng ValidationError() .
Điều này có thể hữu ích nếu bạn cần một số logic xác thực để áp dụng tại thời điểm lưu cơ sở dữ liệu. Ví dụ:
Thông thường, bạn sẽ không cần ghi đè các phương thức sau, mặc dù bạn có thể cần gọi chúng nếu bạn
đang viết các chế độ xem tùy chỉnh bằng cách sử dụng GenericAPIView .
get_serializer_context(self) - Trả về một từ điển chứa bất kỳ ngữ cảnh bổ sung nào cần được
cung cấp cho bộ nối tiếp. Mặc định bao gồm 'request' , 'view' và 'format' các phím.
get_serializer(self, instance=None, data=None, many=False, partial=False) - Trả về một
phiên bản serializer.
get_paginated_response(self, data) - Trả về một Response đối tượng kiểu phân trang.
paginate_queryset(self, queryset) - Phân trang một bộ truy vấn nếu được yêu cầu, trả về một đối
tượng trang hoặc None nếu phân trang không được định cấu hình cho chế độ xem này.
filter_queryset(self, queryset) - Đưa ra một bộ truy vấn, lọc nó với bất kỳ phần phụ trợ bộ lọc
nào đang được sử dụng, trả về một bộ truy vấn mới.
Mixin
Các lớp mixin cung cấp các hành động được sử dụng để cung cấp hành vi xem cơ bản. Lưu ý rằng các lớp
mixin cung cấp các phương thức hành động thay vì xác định trực tiếp các phương thức xử lý, chẳng hạn như
.get() và .post() . Điều này cho phép cấu thành hành vi linh hoạt hơn.
Nếu bộ truy vấn được điền, điều này sẽ trả về một 200 OK phản hồi, với phần trình bày được tuần tự hóa của
bộ truy vấn làm nội dung của phản hồi. Dữ liệu phản hồi có thể được phân trang tùy ý.
TạoModelMixin
Cung cấp một .create(request, *args, **kwargs) phương thức thực hiện việc tạo và lưu một phiên
bản mô hình mới.
Nếu một đối tượng được tạo, điều này sẽ trả về một 201 Created phản hồi, với một biểu diễn tuần tự của
đối tượng làm nội dung của phản hồi. Nếu biểu diễn chứa khóa có tên url , thì Location tiêu đề của phản
hồi sẽ được điền với giá trị đó.
Nếu dữ liệu yêu cầu được cung cấp để tạo đối tượng không hợp lệ thì phản 400 Bad Request hồi sẽ được
trả về, với chi tiết lỗi là nội dung của phản hồi.
Truy xuấtModelMixin
Cung cấp một .retrieve(request, *args, **kwargs) phương thức triển khai việc trả về một phiên bản
mô hình hiện có trong một phản hồi.
Nếu một đối tượng có thể được truy xuất thì điều này sẽ trả về một 200 OK phản hồi, với một biểu diễn tuần
tự của đối tượng làm nội dung của phản hồi. Nếu không, nó sẽ trả về a 404 Not Found .
Cập nhậtModelMixin
Cung cấp một .update(request, *args, **kwargs) phương thức thực hiện cập nhật và lưu một phiên
bản mô hình hiện có.
Cũng cung cấp một .partial_update(request, *args, **kwargs) phương thức tương tự như
update phương thức này, ngoại trừ tất cả các trường dành cho bản cập nhật sẽ là tùy chọn. Điều này cho
phép hỗ trợ PATCH các yêu cầu HTTP.
Nếu một đối tượng được cập nhật, điều này sẽ trả về một 200 OK phản hồi, với một biểu diễn tuần tự của đối
tượng làm nội dung của phản hồi.
Nếu dữ liệu yêu cầu được cung cấp để cập nhật đối tượng không hợp lệ thì phản 400 Bad Request hồi sẽ
được trả về, với chi tiết lỗi là nội dung của phản hồi.
Nếu một đối tượng bị xóa thì nó sẽ trả về một 204 No Content phản hồi, nếu không nó sẽ trả về một 404
Not Found .
TạoAPIView
Được sử dụng cho các điểm cuối chỉ tạo .
Danh sáchAPIView
Được sử dụng cho các điểm cuối chỉ đọc để thể hiện một tập hợp các phiên bản mô hình .
Truy xuấtAPIView
Được sử dụng cho các điểm cuối chỉ đọc để thể hiện một phiên bản mô hình duy nhất .
Cung cấp một get trình xử lý phương thức.
Cập nhậtAPIView
Được sử dụng cho các điểm cuối chỉ cập nhật cho một phiên bản mô hình duy nhất .
Danh sáchTạoAPIView
Được sử dụng cho các điểm cuối đọc-ghi để thể hiện một tập hợp các phiên bản mô hình .
Truy xuấtUpdateAPIView
Được sử dụng để đọc hoặc cập nhật các điểm cuối nhằm thể hiện một phiên bản mô hình duy nhất .
Cung cấp các trình xử lý , và get phương put thức . patch delete
class MultipleFieldLookupMixin:
"""
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 filteri
"""
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.get(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
Sau đó, bạn có thể chỉ cần áp dụng mixin này cho một chế độ xem hoặc tập hợp chế độ xem bất cứ lúc nào
bạn cần áp dụng hành vi tùy chỉnh.
Sử dụng mixin tùy chỉnh là một lựa chọn tốt nếu bạn có hành vi tùy chỉnh cần được sử dụng.
class BaseRetrieveView(MultipleFieldLookupMixin,
generics.RetrieveAPIView):
pass
class BaseRetrieveUpdateDestroyView(MultipleFieldLookupMixin,
generics.RetrieveUpdateDestroyAPIView):
pass
Sử dụng các lớp cơ sở tùy chỉnh là một lựa chọn tốt nếu bạn có hành vi tùy chỉnh cần được lặp lại một cách
nhất quán trên một số lượng lớn chế độ xem trong suốt dự án của mình.
Việc cho phép PUT các hoạt động tạo là có vấn đề, vì nó nhất thiết phải tiết lộ thông tin về sự tồn tại hoặc
không tồn tại của các đối tượng. Cũng không rõ ràng rằng việc cho phép tạo lại các phiên bản đã xóa trước
đó một cách minh bạch nhất thiết phải là một hành vi mặc định tốt hơn là chỉ trả về 404 các phản hồi.
Cả hai kiểu " PUT as 404" và " PUT as create" đều có thể hợp lệ trong các trường hợp khác nhau, nhưng từ
phiên bản 3.0 trở đi, giờ đây chúng tôi sử dụng hành vi 404 làm mặc định, do nó đơn giản và rõ ràng hơn.
Nếu bạn cần hành vi PUT-as-tạo chung, bạn có thể muốn bao gồm một cái gì đó giống như lớp
này AllowPUTAsCreateMixin dưới dạng hỗn hợp cho các chế độ xem của mình.