Reactoo
Reactoo

Reputation: 1042

How to use create function instead of perform_create in ListCreateApiView in django rest framework

I am trying to create a booking api for a website.

For this, I used perform_create function in ListCreateApiView. But, it was someone else who helped me and told me to use perform_create function.

But, I was thinking, it should be possible using create function and is a right approach rather than perform_create function.

Also, I don't really know the difference between these two functions and don't really know when to use which

Here is my code:

    class BookingCreateAPIView(ListCreateAPIView):
        permission_classes= [IsAuthenticated]
        queryset = Booking.objects.all()
        serializer_class = BookingSerializer
    
        def perform_create(self, serializer):
            # user = self.request.user
            package = get_object_or_404(Package, pk= self.kwargs['pk'])
            serializer.save(user=self.request.user,package=package)

Here is my serializer:

    class BookingSerializer(serializers.ModelSerializer):
        # blog = serializers.StringRelatedField()
        class Meta:
            model = Booking
            fields = ['name', 'email', 'phone', 'bookedfor']

Here is my model:

    class Booking(models.Model):
        user = models.ForeignKey(User, on_delete=models.CASCADE)
        package = models.ForeignKey(Package, on_delete=models.CASCADE, related_name='package')
        name = models.CharField(max_length=255)
        email = models.EmailField()
        phone = models.CharField(max_length=255)
        bookedfor = models.DateField()
        created_at = models.DateTimeField(auto_now_add=True)
    
    
        class Meta:
            ordering = ('created_at',)

Upvotes: 1

Views: 3269

Answers (1)

Ngoc Pham
Ngoc Pham

Reputation: 1458

if you looking in source code: ListCreateApiView call

def post(self, request, *args, **kwargs):
    return self.create(request, *args, **kwargs)

then inside create call

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)

That mean perform_create called after serializer validated.

And for what you want, you can override different method.

In my opinion:

  • If you want custom Response return from api, you override create

  • If you want doing anything special after serializer validated, but before object created in database, you override perform_create. Like your example, it want checking Package exists and save request.user in field user

Upvotes: 4

Related Questions