Should I make external API calls in django model managers











up vote
0
down vote

favorite












I have local django models that mirror some external service's entities. So basically when I create a local object, I start with making post requests to the service and then fill fields of the local object with the data from response and save it.



Is it a good idea to put external api calls to model manager in order to abstract the logic for views and tests? Or is there a better approach?



What I would like to achieve is to avoid duplicate logic everywhere in the codebase.










share|improve this question


























    up vote
    0
    down vote

    favorite












    I have local django models that mirror some external service's entities. So basically when I create a local object, I start with making post requests to the service and then fill fields of the local object with the data from response and save it.



    Is it a good idea to put external api calls to model manager in order to abstract the logic for views and tests? Or is there a better approach?



    What I would like to achieve is to avoid duplicate logic everywhere in the codebase.










    share|improve this question
























      up vote
      0
      down vote

      favorite









      up vote
      0
      down vote

      favorite











      I have local django models that mirror some external service's entities. So basically when I create a local object, I start with making post requests to the service and then fill fields of the local object with the data from response and save it.



      Is it a good idea to put external api calls to model manager in order to abstract the logic for views and tests? Or is there a better approach?



      What I would like to achieve is to avoid duplicate logic everywhere in the codebase.










      share|improve this question













      I have local django models that mirror some external service's entities. So basically when I create a local object, I start with making post requests to the service and then fill fields of the local object with the data from response and save it.



      Is it a good idea to put external api calls to model manager in order to abstract the logic for views and tests? Or is there a better approach?



      What I would like to achieve is to avoid duplicate logic everywhere in the codebase.







      django api model






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 19 at 13:56









      Den Kasyanov

      206




      206
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          3
          down vote













          Model manager seems to be a nice idea. But maybe its better to put those logic for external api calls in a separate class. For example:



          class ExternalApiService(object):
          model = ModelName

          def create_object(self, **kwargs):
          # create model object
          self.model.objects.create(**kwargs)

          def call_external_api(self):
          # returns json response from API

          def process_api_response(self, json_response):
          # process response

          def get_latest_object(self):
          # get latest object

          def get_object(self, pk):
          # get object


          And use them in views.



          service = ExternalApiService()

          class SomeView(ListView):
          queryset = service.get_queryset()

          def get_context_data(self, *args, **kwargs):
          context = super(SomeView, self).get_context_data(*args, **kwargs)
          context['something_specific'] = service.get_latest_object()
          return context


          Advantage of having this layering is to separate models and views from business logic and external services. Also gives more flexibility, because you can access external api from the Service Class Object without having access to the Model or dependency on the Model.






          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',
            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%2f53376186%2fshould-i-make-external-api-calls-in-django-model-managers%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








            up vote
            3
            down vote













            Model manager seems to be a nice idea. But maybe its better to put those logic for external api calls in a separate class. For example:



            class ExternalApiService(object):
            model = ModelName

            def create_object(self, **kwargs):
            # create model object
            self.model.objects.create(**kwargs)

            def call_external_api(self):
            # returns json response from API

            def process_api_response(self, json_response):
            # process response

            def get_latest_object(self):
            # get latest object

            def get_object(self, pk):
            # get object


            And use them in views.



            service = ExternalApiService()

            class SomeView(ListView):
            queryset = service.get_queryset()

            def get_context_data(self, *args, **kwargs):
            context = super(SomeView, self).get_context_data(*args, **kwargs)
            context['something_specific'] = service.get_latest_object()
            return context


            Advantage of having this layering is to separate models and views from business logic and external services. Also gives more flexibility, because you can access external api from the Service Class Object without having access to the Model or dependency on the Model.






            share|improve this answer



























              up vote
              3
              down vote













              Model manager seems to be a nice idea. But maybe its better to put those logic for external api calls in a separate class. For example:



              class ExternalApiService(object):
              model = ModelName

              def create_object(self, **kwargs):
              # create model object
              self.model.objects.create(**kwargs)

              def call_external_api(self):
              # returns json response from API

              def process_api_response(self, json_response):
              # process response

              def get_latest_object(self):
              # get latest object

              def get_object(self, pk):
              # get object


              And use them in views.



              service = ExternalApiService()

              class SomeView(ListView):
              queryset = service.get_queryset()

              def get_context_data(self, *args, **kwargs):
              context = super(SomeView, self).get_context_data(*args, **kwargs)
              context['something_specific'] = service.get_latest_object()
              return context


              Advantage of having this layering is to separate models and views from business logic and external services. Also gives more flexibility, because you can access external api from the Service Class Object without having access to the Model or dependency on the Model.






              share|improve this answer

























                up vote
                3
                down vote










                up vote
                3
                down vote









                Model manager seems to be a nice idea. But maybe its better to put those logic for external api calls in a separate class. For example:



                class ExternalApiService(object):
                model = ModelName

                def create_object(self, **kwargs):
                # create model object
                self.model.objects.create(**kwargs)

                def call_external_api(self):
                # returns json response from API

                def process_api_response(self, json_response):
                # process response

                def get_latest_object(self):
                # get latest object

                def get_object(self, pk):
                # get object


                And use them in views.



                service = ExternalApiService()

                class SomeView(ListView):
                queryset = service.get_queryset()

                def get_context_data(self, *args, **kwargs):
                context = super(SomeView, self).get_context_data(*args, **kwargs)
                context['something_specific'] = service.get_latest_object()
                return context


                Advantage of having this layering is to separate models and views from business logic and external services. Also gives more flexibility, because you can access external api from the Service Class Object without having access to the Model or dependency on the Model.






                share|improve this answer














                Model manager seems to be a nice idea. But maybe its better to put those logic for external api calls in a separate class. For example:



                class ExternalApiService(object):
                model = ModelName

                def create_object(self, **kwargs):
                # create model object
                self.model.objects.create(**kwargs)

                def call_external_api(self):
                # returns json response from API

                def process_api_response(self, json_response):
                # process response

                def get_latest_object(self):
                # get latest object

                def get_object(self, pk):
                # get object


                And use them in views.



                service = ExternalApiService()

                class SomeView(ListView):
                queryset = service.get_queryset()

                def get_context_data(self, *args, **kwargs):
                context = super(SomeView, self).get_context_data(*args, **kwargs)
                context['something_specific'] = service.get_latest_object()
                return context


                Advantage of having this layering is to separate models and views from business logic and external services. Also gives more flexibility, because you can access external api from the Service Class Object without having access to the Model or dependency on the Model.







                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Nov 19 at 15:31









                Bruno A.

                48647




                48647










                answered Nov 19 at 14:06









                ruddra

                10.7k32647




                10.7k32647






























                    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.





                    Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                    Please pay close attention to the following guidance:


                    • 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%2f53376186%2fshould-i-make-external-api-calls-in-django-model-managers%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

                    Paul Cézanne

                    UIScrollView CustomStickyHeader Resize height generates problems when scroll is too fast

                    Angular material date-picker (MatDatepicker) auto completes the date on focus out