在Serilizer中清理django api

时间:2018-11-24 08:43:32

标签: django-rest-framework

我写了一个django api,我想知道提醒字段是否已更改,那么约会模型对象会保存当前用户。 我用这个链接 See object changes in post_save in django rest framework 并编写这段代码

class AppointmentBackOfficeViewSet(mixins.ListModelMixin,
                                   mixins.RetrieveModelMixin,
                                   mixins.UpdateModelMixin,
                                   mixins.CreateModelMixin,
                                   viewsets.GenericViewSet):
    model = Appointment
    read_serializer_class = AppointmentSerializer
    write_serializer_class = AppointmentCreateSerializer
    reminder_change = False

    def perform_update(self, serializer):
        if 'reminder' in serializer.validated_data:
            self.reminder_change = True
        serializer.save()

    def update(self, request, *args, **kwargs):
        super(AppointmentBackOfficeViewSet, self).update(request, *args, **kwargs)
        instance = self.get_object()
        instance.user = request.user
        if self.reminder_change:
            instance.reminder_user = request.user
        instance.save()
        res = self.write_serializer_class(instance).data
        return Response(res)

    class AppointmentCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Appointment
        exclude = ['created_time', 'modified_time']

有没有一种方法可以编写比以下代码更清晰的代码: 不要使用self.reminder_change类字段有更好的方法吗? 可能会将这些行移到序列化程序上?(在序列化程序中无法访问request.user)

1 个答案:

答案 0 :(得分:0)

删除了不必要的字段和更新方法:

class AppointmentBackOfficeViewSet(mixins.ListModelMixin,
                                   mixins.RetrieveModelMixin,
                                   mixins.UpdateModelMixin,
                                   mixins.CreateModelMixin,
                                   viewsets.GenericViewSet):
    model = Appointment
    read_serializer_class = AppointmentSerializer
    write_serializer_class = AppointmentCreateSerializer

    def perform_update(self, serializer):
        # Here you can set attributes directly to the serializer update method
        # It's like setting attribute directly to the updating model

        # Check that reminder has been changed
        reminder = serializer.validated_data.get('reminder')

        if reminder and reminder != instance.reminder: # Reminder is different
            serializer.save(user=self.request.user,
                            reminder_user=self.request.user)
        else:
            serializer.save(user=self.request.user)

此解决方案将根据提示字段的类型而起作用。

如果是String或Integer,就可以了。问题是,如果它是对象。 Viewset将引发错误,因为序列化程序提醒字段将是整数,而instance.reminder将成为提醒对象的实例,因此请记住这一点。