Issue
I am making a filmography website.
However, I am having a hard time optimizing the queryset in the detailview.
class Actor(model.Models):
id = models.IntegerField()
name = models.CharField()
class Movie(model.Models):
id = models.IntegerField()
movie_title = models.CharField()
actor = models.ManyToManyField(Actor, related_name='relations')
class ActorView(DetailView):
model = Actor
context_object_name = 'actor'
template_name = 'actor.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['movies'] = self.object.relations.all()
return context
<div>
{{ actor.name }}
{% for movie in movies %}
{{ movie.movie_title }}
{% for actor_info in movie.actor.all %}
{{ actor.name }}
{% endfor %}
{% endfor %}
</div>
I checked the sql tap in the django debug console.
{% for actor_info in movie.actor.all %}
{{ actor.name }}
{% endfor %}
Similar queries are being executed repeatedly in the code above.
And data connection and query execution time are also very slow.
How can I optimize this part in the view or model?
Solution
You can speed this up using prefetch_related
So in your view, change this line from
context['movies'] = self.object.relations.all()
to
context['movies'] = self.object.relations.all().prefetch_related("actor")
Answered By – tushortz
This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0