очистить Django API в Serilizer - PullRequest
0 голосов
/ 24 ноября 2018

Я пишу API-интерфейс Django, который я хотел бы знать, если поле напоминания изменилось, тогда объект модели Назначения сохранит текущего пользователя.я использовал эту ссылку См. изменения объекта в post_save в 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 голосов
/ 25 ноября 2018

Удалены ненужные поля и метод обновления :

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)

Это решение будет работать в зависимости от типа поля напоминания.

Если это строка или целое число, то онобудет в порядке.Проблема в том, что если это объект.Viewset вызовет ошибку, потому что поле напоминания сериализатора будет целочисленным, а instance.reminder будет экземпляром объекта напоминания, так что имейте это в виду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...