- Bạn sẽ sử dụng
create(self, validated_data)
để thêm bất kỳ chi tiết bổ sung nào vào đối tượng trước khi lưu các giá trị AND "prod" vào mỗi trường mô hình giống như cách **validated_data
làm. Nói một cách lý tưởng, bạn chỉ muốn thực hiện hình thức “thúc đẩy” này ở MỘT địa điểm nên create
phương pháp của bạn CommentSerializer
là nơi tốt nhất. Trên hết, bạn cũng có thể gọi các apis bên ngoài để tạo tài khoản người dùng cho họ ngay trước khi lưu tài khoản của bạn vào cơ sở dữ liệu của riêng bạn. Bạn nên sử dụng create
chức năng này kết hợp với ModelViewSet
. Luôn nghĩ - "Lượt xem mỏng, Bộ tuần tự dày".
Thí dụ:
def create(self, validated_data):
email = validated_data.get("email", None)
validated.pop("email")
return models.YourModel.objects.create(email=email, **validated_data)
Các create(self, request, *args, **kwargs)
chức năng trong ModelViewSet
được định nghĩa trong CreateModelMixin
lớp học mà là phụ huynh của ModelViewSet
. CreateModelMixin
Các chức năng chính của nó là:
from rest_framework import status
from rest_framework.response import Response
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()
Như bạn có thể thấy, create
hàm trên đảm nhận việc gọi xác thực trên bộ nối tiếp của bạn và tạo ra phản hồi chính xác. Vẻ đẹp đằng sau điều này là giờ đây bạn có thể cô lập logic ứng dụng của mình và KHÔNG quan tâm đến bản thân về các cuộc gọi xác thực thông thường và lặp đi lặp lại và xử lý đầu ra phản hồi :). Điều này hoạt động khá tốt trong việc kết hợp với create(self, validated_data)
bộ tuần tự được tìm thấy (nơi logic ứng dụng cụ thể của bạn có thể nằm).
- Bây giờ bạn có thể hỏi, tại sao chúng ta có một
perform_create(self, serializer)
chức năng riêng biệt chỉ với một dòng mã!?!? Lý do chính đằng sau điều này là để cho phép khả năng tùy chỉnh khi gọi save
hàm. Bạn có thể muốn cung cấp thêm dữ liệu trước khi gọi save
(giống nhưserializer.save(owner=self.request.user)
và nếu chúng tôi không có perform_create(self, serializer)
, bạn sẽ phải ghi đè create(self, request, *args, **kwargs)
và điều đó chỉ làm mất đi mục đích của việc các mixin thực hiện công việc nặng nhọc và nhàm chán.
Hi vọng điêu nay co ich!
create(self, validated_data)
tuần tự, nó có nghĩa là nó tập trung vào logic xác thực dữ liệu? và hơn thế nữa, nó có thể giúp trả lại dữ liệu của trình nối tiếp đã cho trở lại phản hồi phải không?