yestema
yestema

Reputation: 8112

Check the current values of instance while doing perform_update in django rest framework

I'm using Django Rest Framework. Here is model:

class TimeSlot(models.Model):
    date_start = models.DateTimeField(default=None, null=True, blank=True)
    booked = models.BooleanField(default=False)
    user = models.ForeignKey(User, related_name='time_slots', on_delete=models.SET_NULL, default=None)

Here is my serializer:

class CreateBookingSerializer(serializers.ModelSerializer):
    class Meta:
        model = TimeSlot
        fields = ('id','booked','user',)
        extra_kwargs = {'booked': {'required': True}}

Here is my view:

class CreateBookingViewSet(viewsets.ModelViewSet):
    queryset = TimeSlot.objects.all()
    serializer_class = CreateBookingSerializer
    http_method_names = ['put']
    def perform_update(self, serializer):
        if (self.request.data['booked'] == 1):
            serializer.save(user=self.request.user, booked=True)

I want to set booked to true only if the current value is False. I'm using PUT method. so my url is /create_booking/id/

If I could get the id in my view, I would check the current booked value! How to get the id?

Upvotes: 4

Views: 1533

Answers (1)

D. Make
D. Make

Reputation: 600

You can try to use self.kwargs['id'].

class CreateBookingViewSet(viewsets.ModelViewSet):
    queryset = TimeSlot.objects.all()
    serializer_class = CreateBookingSerializer
    http_method_names = ['put']
    def perform_update(self, serializer):
        id = self.kwargs['id']
        if (self.request.data['booked'] == 1):
            serializer.save(user=self.request.user, booked=True)

Upvotes: 5

Related Questions