Does select_related on an already queryed field perform a SQL query?












0















Let's assume that Car has multiple wheels and a wheel has one color.

Does the 4th line performs an SQL query ?



cars = Car.objects.prefetch_related('wheel_set__color')
for car in cars:
for wheel in car.wheel_set:
print(wheel.color)









share|improve this question





























    0















    Let's assume that Car has multiple wheels and a wheel has one color.

    Does the 4th line performs an SQL query ?



    cars = Car.objects.prefetch_related('wheel_set__color')
    for car in cars:
    for wheel in car.wheel_set:
    print(wheel.color)









    share|improve this question



























      0












      0








      0








      Let's assume that Car has multiple wheels and a wheel has one color.

      Does the 4th line performs an SQL query ?



      cars = Car.objects.prefetch_related('wheel_set__color')
      for car in cars:
      for wheel in car.wheel_set:
      print(wheel.color)









      share|improve this question
















      Let's assume that Car has multiple wheels and a wheel has one color.

      Does the 4th line performs an SQL query ?



      cars = Car.objects.prefetch_related('wheel_set__color')
      for car in cars:
      for wheel in car.wheel_set:
      print(wheel.color)






      python django django-models orm django-orm






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 21 '18 at 11:34







      Louis Saglio

















      asked Nov 21 '18 at 10:49









      Louis SaglioLouis Saglio

      13524




      13524
























          1 Answer
          1






          active

          oldest

          votes


















          0














          Your question asks about select_related() but your code specifies prefetch_related() so I'll address both.



          The following will hit the database once:



          cars = Car.objects.select_related('wheel_set__color')
          for car in cars:
          for wheel in car.wheel_set:
          print(wheel.color)


          The following will hit the database three times:



          cars = Car.objects.prefetch_related('wheel_set__color')
          for car in cars:
          for wheel in car.wheel_set:
          print(wheel.color)


          However, the following will hit the database twice:



          cars = Car.objects.select_related('wheel_set').prefetch_related('wheel_set__color')
          for car in cars:
          for wheel in car.wheel_set:
          print(wheel.color)


          https://docs.djangoproject.com/en/2.1/ref/models/querysets/#select-related






          share|improve this answer
























          • Thank you for pointing out to me the absence of select related, I actually forgot a line : cars = Car.objects.prefetch_related('wheel_set__color') for car in cars: car.select_related('wheel_set') for wheel in car.wheel_set: print(wheel.color)

            – Louis Saglio
            Nov 22 '18 at 9:26













          • I don't see why you would do that. Is your intent to minimize the number of database queries?

            – tommy
            Nov 28 '18 at 16:14











          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%2f53410457%2fdoes-select-related-on-an-already-queryed-field-perform-a-sql-query%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














          Your question asks about select_related() but your code specifies prefetch_related() so I'll address both.



          The following will hit the database once:



          cars = Car.objects.select_related('wheel_set__color')
          for car in cars:
          for wheel in car.wheel_set:
          print(wheel.color)


          The following will hit the database three times:



          cars = Car.objects.prefetch_related('wheel_set__color')
          for car in cars:
          for wheel in car.wheel_set:
          print(wheel.color)


          However, the following will hit the database twice:



          cars = Car.objects.select_related('wheel_set').prefetch_related('wheel_set__color')
          for car in cars:
          for wheel in car.wheel_set:
          print(wheel.color)


          https://docs.djangoproject.com/en/2.1/ref/models/querysets/#select-related






          share|improve this answer
























          • Thank you for pointing out to me the absence of select related, I actually forgot a line : cars = Car.objects.prefetch_related('wheel_set__color') for car in cars: car.select_related('wheel_set') for wheel in car.wheel_set: print(wheel.color)

            – Louis Saglio
            Nov 22 '18 at 9:26













          • I don't see why you would do that. Is your intent to minimize the number of database queries?

            – tommy
            Nov 28 '18 at 16:14
















          0














          Your question asks about select_related() but your code specifies prefetch_related() so I'll address both.



          The following will hit the database once:



          cars = Car.objects.select_related('wheel_set__color')
          for car in cars:
          for wheel in car.wheel_set:
          print(wheel.color)


          The following will hit the database three times:



          cars = Car.objects.prefetch_related('wheel_set__color')
          for car in cars:
          for wheel in car.wheel_set:
          print(wheel.color)


          However, the following will hit the database twice:



          cars = Car.objects.select_related('wheel_set').prefetch_related('wheel_set__color')
          for car in cars:
          for wheel in car.wheel_set:
          print(wheel.color)


          https://docs.djangoproject.com/en/2.1/ref/models/querysets/#select-related






          share|improve this answer
























          • Thank you for pointing out to me the absence of select related, I actually forgot a line : cars = Car.objects.prefetch_related('wheel_set__color') for car in cars: car.select_related('wheel_set') for wheel in car.wheel_set: print(wheel.color)

            – Louis Saglio
            Nov 22 '18 at 9:26













          • I don't see why you would do that. Is your intent to minimize the number of database queries?

            – tommy
            Nov 28 '18 at 16:14














          0












          0








          0







          Your question asks about select_related() but your code specifies prefetch_related() so I'll address both.



          The following will hit the database once:



          cars = Car.objects.select_related('wheel_set__color')
          for car in cars:
          for wheel in car.wheel_set:
          print(wheel.color)


          The following will hit the database three times:



          cars = Car.objects.prefetch_related('wheel_set__color')
          for car in cars:
          for wheel in car.wheel_set:
          print(wheel.color)


          However, the following will hit the database twice:



          cars = Car.objects.select_related('wheel_set').prefetch_related('wheel_set__color')
          for car in cars:
          for wheel in car.wheel_set:
          print(wheel.color)


          https://docs.djangoproject.com/en/2.1/ref/models/querysets/#select-related






          share|improve this answer













          Your question asks about select_related() but your code specifies prefetch_related() so I'll address both.



          The following will hit the database once:



          cars = Car.objects.select_related('wheel_set__color')
          for car in cars:
          for wheel in car.wheel_set:
          print(wheel.color)


          The following will hit the database three times:



          cars = Car.objects.prefetch_related('wheel_set__color')
          for car in cars:
          for wheel in car.wheel_set:
          print(wheel.color)


          However, the following will hit the database twice:



          cars = Car.objects.select_related('wheel_set').prefetch_related('wheel_set__color')
          for car in cars:
          for wheel in car.wheel_set:
          print(wheel.color)


          https://docs.djangoproject.com/en/2.1/ref/models/querysets/#select-related







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 21 '18 at 17:25









          tommytommy

          3171310




          3171310













          • Thank you for pointing out to me the absence of select related, I actually forgot a line : cars = Car.objects.prefetch_related('wheel_set__color') for car in cars: car.select_related('wheel_set') for wheel in car.wheel_set: print(wheel.color)

            – Louis Saglio
            Nov 22 '18 at 9:26













          • I don't see why you would do that. Is your intent to minimize the number of database queries?

            – tommy
            Nov 28 '18 at 16:14



















          • Thank you for pointing out to me the absence of select related, I actually forgot a line : cars = Car.objects.prefetch_related('wheel_set__color') for car in cars: car.select_related('wheel_set') for wheel in car.wheel_set: print(wheel.color)

            – Louis Saglio
            Nov 22 '18 at 9:26













          • I don't see why you would do that. Is your intent to minimize the number of database queries?

            – tommy
            Nov 28 '18 at 16:14

















          Thank you for pointing out to me the absence of select related, I actually forgot a line : cars = Car.objects.prefetch_related('wheel_set__color') for car in cars: car.select_related('wheel_set') for wheel in car.wheel_set: print(wheel.color)

          – Louis Saglio
          Nov 22 '18 at 9:26







          Thank you for pointing out to me the absence of select related, I actually forgot a line : cars = Car.objects.prefetch_related('wheel_set__color') for car in cars: car.select_related('wheel_set') for wheel in car.wheel_set: print(wheel.color)

          – Louis Saglio
          Nov 22 '18 at 9:26















          I don't see why you would do that. Is your intent to minimize the number of database queries?

          – tommy
          Nov 28 '18 at 16:14





          I don't see why you would do that. Is your intent to minimize the number of database queries?

          – tommy
          Nov 28 '18 at 16:14




















          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%2f53410457%2fdoes-select-related-on-an-already-queryed-field-perform-a-sql-query%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

          in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith