clean django api in serilizer












0















i write a django api i would like to know if reminder field changed then the Appointment model object save current user.
i used this link
See object changes in post_save in django rest framework
and write this code



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']


is there a way to write this code clearer than this :
dont use self.reminder_change class field is there better way?
may be move this lines to serializer??(in serializer dont access to request.user)










share|improve this question





























    0















    i write a django api i would like to know if reminder field changed then the Appointment model object save current user.
    i used this link
    See object changes in post_save in django rest framework
    and write this code



    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']


    is there a way to write this code clearer than this :
    dont use self.reminder_change class field is there better way?
    may be move this lines to serializer??(in serializer dont access to request.user)










    share|improve this question



























      0












      0








      0








      i write a django api i would like to know if reminder field changed then the Appointment model object save current user.
      i used this link
      See object changes in post_save in django rest framework
      and write this code



      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']


      is there a way to write this code clearer than this :
      dont use self.reminder_change class field is there better way?
      may be move this lines to serializer??(in serializer dont access to request.user)










      share|improve this question
















      i write a django api i would like to know if reminder field changed then the Appointment model object save current user.
      i used this link
      See object changes in post_save in django rest framework
      and write this code



      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']


      is there a way to write this code clearer than this :
      dont use self.reminder_change class field is there better way?
      may be move this lines to serializer??(in serializer dont access to request.user)







      django-rest-framework






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 24 '18 at 9:44







      amir boluri

















      asked Nov 24 '18 at 8:43









      amir boluriamir boluri

      193




      193
























          1 Answer
          1






          active

          oldest

          votes


















          0














          Removed unecessary fields and update method:



          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)


          This solution will work depending on what type of reminder field is.



          If it's String or Integer it will be ok. Problem is that if it's object. Viewset will raise error because serializer reminder field would be integer but instance.reminder would be instance of the reminder object so keep this in mind.






          share|improve this answer























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53456570%2fclean-django-api-in-serilizer%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            Removed unecessary fields and update method:



            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)


            This solution will work depending on what type of reminder field is.



            If it's String or Integer it will be ok. Problem is that if it's object. Viewset will raise error because serializer reminder field would be integer but instance.reminder would be instance of the reminder object so keep this in mind.






            share|improve this answer




























              0














              Removed unecessary fields and update method:



              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)


              This solution will work depending on what type of reminder field is.



              If it's String or Integer it will be ok. Problem is that if it's object. Viewset will raise error because serializer reminder field would be integer but instance.reminder would be instance of the reminder object so keep this in mind.






              share|improve this answer


























                0












                0








                0







                Removed unecessary fields and update method:



                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)


                This solution will work depending on what type of reminder field is.



                If it's String or Integer it will be ok. Problem is that if it's object. Viewset will raise error because serializer reminder field would be integer but instance.reminder would be instance of the reminder object so keep this in mind.






                share|improve this answer













                Removed unecessary fields and update method:



                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)


                This solution will work depending on what type of reminder field is.



                If it's String or Integer it will be ok. Problem is that if it's object. Viewset will raise error because serializer reminder field would be integer but instance.reminder would be instance of the reminder object so keep this in mind.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 25 '18 at 11:24









                mon iomon io

                2464




                2464
































                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53456570%2fclean-django-api-in-serilizer%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    To store a contact into the json file from server.js file using a class in NodeJS

                    Redirect URL with Chrome Remote Debugging Android Devices

                    Dieringhausen