Django ModelViewSet PATCH request return model fields updated












0















class MerchantStampCardViewSet(viewsets.ModelViewSet):
'''
A view set for listing/retrieving/updating/deleting stamp cards for the current
merchant
'''
permission_classes = (IsMerchantAndAuthenticated, )

def get_queryset(self):
if len(MerchantProfile.objects.filter(user=self.request.user)) > 0:
merchant_profile = MerchantProfile.objects.get(user=self.request.user)
if merchant_profile.merchant:
return StampCard.objects.filter(merchant=merchant_profile.merchant)
return None

def get_serializer_class(self):
if self.request.method == 'GET':
return StampCardSerializerWithRewards
else:
return StampCardSerializer


I'm trying to make this code return the fields changed in the response body. The model class has a couple fields like name, city, province, zip code and address and through the front-end the user can only change one at a time, but I want the body of the 200 response to contain the field name changed and the new value just to confirm that a change was successful and nothing went wrong.



So for example if the user changes the name to Billy. The response should be 200 and the body should say {name : 'Billy'}



How do I do this?










share|improve this question























  • Just to confirm, you want to return only the updated fields and not all the fields of that object ?

    – Mohammad Umair
    Nov 20 '18 at 5:19











  • yes! Thank you in advanced

    – DolanTheMFWizard
    Nov 20 '18 at 7:36
















0















class MerchantStampCardViewSet(viewsets.ModelViewSet):
'''
A view set for listing/retrieving/updating/deleting stamp cards for the current
merchant
'''
permission_classes = (IsMerchantAndAuthenticated, )

def get_queryset(self):
if len(MerchantProfile.objects.filter(user=self.request.user)) > 0:
merchant_profile = MerchantProfile.objects.get(user=self.request.user)
if merchant_profile.merchant:
return StampCard.objects.filter(merchant=merchant_profile.merchant)
return None

def get_serializer_class(self):
if self.request.method == 'GET':
return StampCardSerializerWithRewards
else:
return StampCardSerializer


I'm trying to make this code return the fields changed in the response body. The model class has a couple fields like name, city, province, zip code and address and through the front-end the user can only change one at a time, but I want the body of the 200 response to contain the field name changed and the new value just to confirm that a change was successful and nothing went wrong.



So for example if the user changes the name to Billy. The response should be 200 and the body should say {name : 'Billy'}



How do I do this?










share|improve this question























  • Just to confirm, you want to return only the updated fields and not all the fields of that object ?

    – Mohammad Umair
    Nov 20 '18 at 5:19











  • yes! Thank you in advanced

    – DolanTheMFWizard
    Nov 20 '18 at 7:36














0












0








0








class MerchantStampCardViewSet(viewsets.ModelViewSet):
'''
A view set for listing/retrieving/updating/deleting stamp cards for the current
merchant
'''
permission_classes = (IsMerchantAndAuthenticated, )

def get_queryset(self):
if len(MerchantProfile.objects.filter(user=self.request.user)) > 0:
merchant_profile = MerchantProfile.objects.get(user=self.request.user)
if merchant_profile.merchant:
return StampCard.objects.filter(merchant=merchant_profile.merchant)
return None

def get_serializer_class(self):
if self.request.method == 'GET':
return StampCardSerializerWithRewards
else:
return StampCardSerializer


I'm trying to make this code return the fields changed in the response body. The model class has a couple fields like name, city, province, zip code and address and through the front-end the user can only change one at a time, but I want the body of the 200 response to contain the field name changed and the new value just to confirm that a change was successful and nothing went wrong.



So for example if the user changes the name to Billy. The response should be 200 and the body should say {name : 'Billy'}



How do I do this?










share|improve this question














class MerchantStampCardViewSet(viewsets.ModelViewSet):
'''
A view set for listing/retrieving/updating/deleting stamp cards for the current
merchant
'''
permission_classes = (IsMerchantAndAuthenticated, )

def get_queryset(self):
if len(MerchantProfile.objects.filter(user=self.request.user)) > 0:
merchant_profile = MerchantProfile.objects.get(user=self.request.user)
if merchant_profile.merchant:
return StampCard.objects.filter(merchant=merchant_profile.merchant)
return None

def get_serializer_class(self):
if self.request.method == 'GET':
return StampCardSerializerWithRewards
else:
return StampCardSerializer


I'm trying to make this code return the fields changed in the response body. The model class has a couple fields like name, city, province, zip code and address and through the front-end the user can only change one at a time, but I want the body of the 200 response to contain the field name changed and the new value just to confirm that a change was successful and nothing went wrong.



So for example if the user changes the name to Billy. The response should be 200 and the body should say {name : 'Billy'}



How do I do this?







django django-rest-framework






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 20 '18 at 4:50









DolanTheMFWizardDolanTheMFWizard

908




908













  • Just to confirm, you want to return only the updated fields and not all the fields of that object ?

    – Mohammad Umair
    Nov 20 '18 at 5:19











  • yes! Thank you in advanced

    – DolanTheMFWizard
    Nov 20 '18 at 7:36



















  • Just to confirm, you want to return only the updated fields and not all the fields of that object ?

    – Mohammad Umair
    Nov 20 '18 at 5:19











  • yes! Thank you in advanced

    – DolanTheMFWizard
    Nov 20 '18 at 7:36

















Just to confirm, you want to return only the updated fields and not all the fields of that object ?

– Mohammad Umair
Nov 20 '18 at 5:19





Just to confirm, you want to return only the updated fields and not all the fields of that object ?

– Mohammad Umair
Nov 20 '18 at 5:19













yes! Thank you in advanced

– DolanTheMFWizard
Nov 20 '18 at 7:36





yes! Thank you in advanced

– DolanTheMFWizard
Nov 20 '18 at 7:36












1 Answer
1






active

oldest

votes


















0














You can try like this:



class YourViewSet(...):

def update(self, request, *args, **kwargs):
instance = self.get_object()
current_data = self.get_serializer(instance).data # collect current data
# next few lines of the code is from default implementation
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
if getattr(instance, '_prefetched_objects_cache', None):
instance._prefetched_objects_cache = {}

updated_data = serializer.data # now we get the updated data
response_dict = dict()
for key, value in current_data:
# find the differences
if updated_data.get(key) != value:
response_dict[key] = updated_data.get(key)
return Response(response_dict) # send the difference through response


Here I have put a override on update method. Then I have collected the dictionary data from current object and updated object. Then compared them and sent differences in a dictionary as response. FYI its an untested code.






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%2f53386415%2fdjango-modelviewset-patch-request-return-model-fields-updated%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














    You can try like this:



    class YourViewSet(...):

    def update(self, request, *args, **kwargs):
    instance = self.get_object()
    current_data = self.get_serializer(instance).data # collect current data
    # next few lines of the code is from default implementation
    serializer = self.get_serializer(instance, data=request.data, partial=partial)
    serializer.is_valid(raise_exception=True)
    self.perform_update(serializer)
    if getattr(instance, '_prefetched_objects_cache', None):
    instance._prefetched_objects_cache = {}

    updated_data = serializer.data # now we get the updated data
    response_dict = dict()
    for key, value in current_data:
    # find the differences
    if updated_data.get(key) != value:
    response_dict[key] = updated_data.get(key)
    return Response(response_dict) # send the difference through response


    Here I have put a override on update method. Then I have collected the dictionary data from current object and updated object. Then compared them and sent differences in a dictionary as response. FYI its an untested code.






    share|improve this answer




























      0














      You can try like this:



      class YourViewSet(...):

      def update(self, request, *args, **kwargs):
      instance = self.get_object()
      current_data = self.get_serializer(instance).data # collect current data
      # next few lines of the code is from default implementation
      serializer = self.get_serializer(instance, data=request.data, partial=partial)
      serializer.is_valid(raise_exception=True)
      self.perform_update(serializer)
      if getattr(instance, '_prefetched_objects_cache', None):
      instance._prefetched_objects_cache = {}

      updated_data = serializer.data # now we get the updated data
      response_dict = dict()
      for key, value in current_data:
      # find the differences
      if updated_data.get(key) != value:
      response_dict[key] = updated_data.get(key)
      return Response(response_dict) # send the difference through response


      Here I have put a override on update method. Then I have collected the dictionary data from current object and updated object. Then compared them and sent differences in a dictionary as response. FYI its an untested code.






      share|improve this answer


























        0












        0








        0







        You can try like this:



        class YourViewSet(...):

        def update(self, request, *args, **kwargs):
        instance = self.get_object()
        current_data = self.get_serializer(instance).data # collect current data
        # next few lines of the code is from default implementation
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)
        if getattr(instance, '_prefetched_objects_cache', None):
        instance._prefetched_objects_cache = {}

        updated_data = serializer.data # now we get the updated data
        response_dict = dict()
        for key, value in current_data:
        # find the differences
        if updated_data.get(key) != value:
        response_dict[key] = updated_data.get(key)
        return Response(response_dict) # send the difference through response


        Here I have put a override on update method. Then I have collected the dictionary data from current object and updated object. Then compared them and sent differences in a dictionary as response. FYI its an untested code.






        share|improve this answer













        You can try like this:



        class YourViewSet(...):

        def update(self, request, *args, **kwargs):
        instance = self.get_object()
        current_data = self.get_serializer(instance).data # collect current data
        # next few lines of the code is from default implementation
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)
        if getattr(instance, '_prefetched_objects_cache', None):
        instance._prefetched_objects_cache = {}

        updated_data = serializer.data # now we get the updated data
        response_dict = dict()
        for key, value in current_data:
        # find the differences
        if updated_data.get(key) != value:
        response_dict[key] = updated_data.get(key)
        return Response(response_dict) # send the difference through response


        Here I have put a override on update method. Then I have collected the dictionary data from current object and updated object. Then compared them and sent differences in a dictionary as response. FYI its an untested code.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 20 '18 at 8:48









        ruddraruddra

        12.7k32648




        12.7k32648






























            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%2f53386415%2fdjango-modelviewset-patch-request-return-model-fields-updated%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

            MongoDB - Not Authorized To Execute Command

            How to fix TextFormField cause rebuild widget in Flutter

            Npm cannot find a required file even through it is in the searched directory