Does select_related on an already queryed field perform a SQL query?
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
add a comment |
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
add a comment |
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
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
python django django-models orm django-orm
edited Nov 21 '18 at 11:34
Louis Saglio
asked Nov 21 '18 at 10:49
Louis SaglioLouis Saglio
13524
13524
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
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
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
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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
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
add a comment |
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
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
add a comment |
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
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
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
add a comment |
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
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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