在Django Rest框架中执行perform_update时检查实例的当前值

时间:2019-02-11 16:15:09

标签: django django-rest-framework

我正在使用Django Rest Framework。 这是模型:

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)

这是我的序列化器

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

这是我的视图:

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)

仅当当前值为False时,我才希望将booked设置为true。 我正在使用PUT方法。所以我的网址是/create_booking/id/

如果我可以看到id,我将检查当前的booked值!如何获得id

1 个答案:

答案 0 :(得分:2)

您可以尝试使用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)