create(self, validated_data)Tıpkı **validated_datayaptığı gibi her model alanına AND "prod" değerlerini kaydetmeden önce nesneye herhangi bir ekstra ayrıntı eklemek için kullanırsınız . İdeal olarak konuşursak, bu tür "dürtmeyi" yalnızca TEK bir yerde yapmak istersiniz, böylece createsizin yönteminiz CommentSerializeren iyi yerdir. Bunun da ötesinde, hesaplarınızı kendi veritabanınıza kaydetmeden hemen önce kendi tarafında kullanıcı hesapları oluşturmak için harici apis'leri de aramak isteyebilirsiniz. Bu createişlevi ile birlikte kullanmalısınız ModelViewSet. Her zaman düşünün - "İnce görünümler, Kalın serileştiriciler".
Misal:
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)İşlev ModelViewSetde tanımlandığı CreateModelMixinüstüdür sınıfı ModelViewSet. CreateModelMixinana işlevleri şunlardır:
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()
Gördüğünüz gibi, yukarıdaki createişlev serileştiricinizde doğrulama çağırma ve doğru yanıtı üretme ile ilgilenir. Bunun arkasındaki güzellik, artık uygulama mantığınızı izole edebilmeniz ve kendinizi sıradan ve tekrarlayan doğrulama çağrıları ve işleme yanıt çıktısıyla ilgilenmeyebilmenizdir :). Bu create(self, validated_data), serileştiricide bulunan (özel uygulama mantığınızın bulunduğu yerde) ile birlikte oldukça iyi çalışır .
- Şimdi sorabilirsiniz, neden
perform_create(self, serializer)sadece bir satır kodlu ayrı bir fonksiyonumuz var!?!? Bunun arkasındaki ana sebep, saveişlevi çağırırken özelleştirilebilirliğe izin vermektir . Aramadan önce fazladan veri sağlamak isteyebilirsiniz save (örneğinserializer.save(owner=self.request.user) , bizde perform_create(self, serializer)olmasaydı create(self, request, *args, **kwargs), ağır ve sıkıcı işleri yapan mixinlere sahip olma amacını geçersiz kılmanız gerekirdi .
Bu yardımcı olur umarım!
create(self, validated_data)serileştiriciye içinde, bunun veri doğrulama mantığı odaklanır demektir? ve daha fazlası, verilen serileştiricinin verilerini yanıta geri döndürmeye yardımcı olabilir, değil mi?