问题
Let's say I have following models
class Foo(models.Model):
...
class Prop(models.Model):
...
class Bar(models.Model):
foo: models.ForeignKey(Foo, related_name='bars', ...)
prop: models.ForeignKey(Prop, ...)
Now I want to make the following query.
foos = Foo.objects.prefetch_related('bars__prop').all()
Does the above query makes 3 Database calls or only 2 (select_related for prop
from bar
), given that only one prop
is associated with bar
If it takes 3 calls then, is there a way to make it 2 calls by using selected_related for bar -> prop
回答1:
You can use the Prefetch class to specify the queryset that is used in prefetch_related()
and this way combine it with select_related()
:
from django.db.models import Prefetch
bars = Bar.objects.select_related('prop')
foos = Foo.objects.prefetch_related(Prefetch('bars', queryset=bars)).all()
Note that this should be two queries, one for the Foo
objects and one for getting the related Bar
objects that are being joined in the same query with Prop
.
来源:https://stackoverflow.com/questions/54569384/django-chaining-prefetch-related-and-select-related