- Anda akan menggunakan
create(self, validated_data)
untuk menambahkan detail tambahan ke objek sebelum menyimpan nilai AND "prod" ke setiap bidang model seperti yang **validated_data
dilakukan. Idealnya, Anda ingin melakukan bentuk "dorongan" ini hanya di SATU lokasi sehingga create
metode di tempat Anda CommentSerializer
adalah yang terbaik. Selain itu, Anda mungkin juga ingin memanggil API eksternal untuk membuat akun pengguna di pihak mereka sebelum menyimpan akun Anda ke dalam database Anda sendiri. Anda harus menggunakan create
fungsi ini bersama dengan ModelViewSet
. Selalu berpikir - "Tampilan tipis, serializers Tebal".
Contoh:
def create(self, validated_data):
email = validated_data.get("email", None)
validated.pop("email")
return models.YourModel.objects.create(email=email, **validated_data)
The create(self, request, *args, **kwargs)
fungsi dalam ModelViewSet
didefinisikan dalam CreateModelMixin
kelas yang merupakan induk dari ModelViewSet
. CreateModelMixin
Fungsi utamanya adalah sebagai berikut:
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()
Seperti yang Anda lihat, create
fungsi di atas menangani validasi panggilan pada pembuat serial Anda dan menghasilkan respons yang benar. Keindahan di balik ini, adalah bahwa Anda sekarang dapat mengisolasi logika aplikasi Anda dan TIDAK mengkhawatirkan diri Anda sendiri tentang panggilan validasi yang biasa dan berulang serta menangani keluaran respons :). Ini bekerja cukup baik sehubungan dengan yang create(self, validated_data)
ditemukan di serializer (di mana logika aplikasi spesifik Anda mungkin berada).
- Sekarang Anda mungkin bertanya, mengapa kita memiliki
perform_create(self, serializer)
fungsi terpisah hanya dengan satu baris kode!?!? Nah, alasan utama di balik ini adalah untuk memungkinkan penyesuaian saat memanggil save
fungsi. Anda mungkin ingin memberikan data tambahan sebelum menelepon save
(sepertiserializer.save(owner=self.request.user)
dan jika kami tidak memilikinya perform_create(self, serializer)
, Anda harus mengganti create(self, request, *args, **kwargs)
dan itu hanya akan mengalahkan tujuan membuat mixin melakukan pekerjaan yang berat dan membosankan.
Semoga ini membantu!
create(self, validated_data)
di serializer, artinya berfokus pada logika validasi data? dan lebih dari itu dapat membantu mengembalikan data serializer yang diberikan kembali ke respon kan?create
fungsi di serializer itu sendiri hanya dipanggil saat Anda melakukannyaserializer.save()
. Dalam Andacreate(self, request)
fungsi dalam (AccountViewSet
), Anda tidak meneleponserializer.save()
sama sekali dan oleh karena itu, satu-satunya contoh penciptaan yang terjadi dengan panggilan ini:Account.objects.create_user(**serializer.validated_data)
.