首页 > 解决方案 > 在序列化器中清理 django api

问题描述

我写了一个 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)

标签: 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

    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 将是提醒对象的实例,因此请记住这一点。


推荐阅读