- คุณจะใช้
create(self, validated_data)
เพื่อเพิ่มรายละเอียดพิเศษใด ๆ ลงในออบเจ็กต์ก่อนที่จะบันทึกและ "prod" ค่าลงในฟิลด์แต่ละรุ่นเช่นเดียวกับที่**validated_data
ทำ ตามหลักการแล้วคุณต้องการทำรูปแบบ "การแยง" นี้ในสถานที่เดียวเท่านั้นดังนั้นcreate
วิธีการของคุณCommentSerializer
จึงเป็นสถานที่ที่ดีที่สุด นอกจากนี้คุณอาจต้องการเรียก apis ภายนอกเพื่อสร้างบัญชีผู้ใช้ที่ด้านข้างก่อนบันทึกบัญชีของคุณลงในฐานข้อมูลของคุณเอง คุณควรใช้นี้ฟังก์ชั่นร่วมกับcreate
ModelViewSet
คิดเสมอว่า - "Thin views, Thick serializers"
ตัวอย่าง:
def create(self, validated_data):
email = validated_data.get("email", None)
validated.pop("email")
return models.YourModel.objects.create(email=email, **validated_data)
create(self, request, *args, **kwargs)
ฟังก์ชั่นในModelViewSet
ถูกกำหนดไว้ในชั้นเรียนซึ่งเป็นแม่ของCreateModelMixin
หน้าที่หลักมีดังนี้:ModelViewSet
CreateModelMixin
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()
อย่างที่คุณเห็นcreate
ฟังก์ชั่นด้านบนดูแลการเรียกตรวจสอบความถูกต้องบนซีเรียลไลเซอร์ของคุณและสร้างการตอบสนองที่ถูกต้อง ความงามที่อยู่เบื้องหลังสิ่งนี้คือตอนนี้คุณสามารถแยกตรรกะของแอปพลิเคชันของคุณและไม่ต้องกังวลกับตัวเองเกี่ยวกับการเรียกตรวจสอบความถูกต้องทางโลกและทางซ้ำและการจัดการผลลัพธ์การตอบสนอง :) สิ่งนี้ทำงานได้ค่อนข้างดีในการเชื่อมต่อกับcreate(self, validated_data)
found ใน serializer (ซึ่งตรรกะของแอปพลิเคชันเฉพาะของคุณอาจอยู่)
- ตอนนี้คุณอาจถามว่าทำไมเราถึงมี
perform_create(self, serializer)
ฟังก์ชันแยกกันด้วยรหัสเพียงบรรทัดเดียว!?!? เหตุผลหลักที่อยู่เบื้องหลังนี้คือเพื่อให้สามารถปรับแต่งได้เมื่อเรียกใช้save
ฟังก์ชัน คุณอาจต้องการจัดหาข้อมูลเพิ่มเติมก่อนโทรsave
(เช่นserializer.save(owner=self.request.user)
และถ้าเราไม่มีperform_create(self, serializer)
คุณจะต้องลบล้างcreate(self, request, *args, **kwargs)
และนั่นก็เอาชนะจุดประสงค์ของการให้มิกซ์อินทำงานหนักและน่าเบื่อ
หวังว่านี่จะช่วยได้!
create(self, validated_data)
serializer หมายความว่ามันเน้นตรรกะการตรวจสอบข้อมูล? และยิ่งไปกว่านั้นมันสามารถช่วยส่งคืนข้อมูลของ serializer ที่ระบุกลับไปที่การตอบสนองได้ใช่ไหม