|
3 | 3 | from django.contrib.contenttypes.models import ContentType
|
4 | 4 | from django.db.models import Exists
|
5 | 5 | from django.db.models import OuterRef
|
| 6 | +from django.db.models import Prefetch |
6 | 7 | from rest_flex_fields import is_expanded
|
7 | 8 | from rest_flex_fields.views import FlexFieldsMixin
|
8 | 9 | from rest_framework import status
|
|
39 | 40 | from readthedocs.oauth.models import RemoteRepositoryRelation
|
40 | 41 | from readthedocs.organizations.models import Organization
|
41 | 42 | from readthedocs.organizations.models import Team
|
| 43 | +from readthedocs.projects.models import Domain |
42 | 44 | from readthedocs.projects.models import EnvironmentVariable
|
43 | 45 | from readthedocs.projects.models import Project
|
44 | 46 | from readthedocs.projects.models import ProjectRelationship
|
@@ -177,11 +179,23 @@ def get_queryset(self):
|
177 | 179 | # This could be a class attribute and managed on the ``ProjectQuerySetMixin`` in
|
178 | 180 | # case we want to extend the ``prefetch_related`` to other views as
|
179 | 181 | # well.
|
180 |
| - return queryset.prefetch_related( |
181 |
| - "related_projects", |
182 |
| - "domains", |
| 182 | + return queryset.select_related( |
| 183 | + "main_language_project", |
| 184 | + ).prefetch_related( |
183 | 185 | "tags",
|
184 | 186 | "users",
|
| 187 | + # Prefetch superprojects to avoid N+1 queries when serializing the project. |
| 188 | + Prefetch( |
| 189 | + "superprojects", |
| 190 | + ProjectRelationship.objects.all().select_related("parent"), |
| 191 | + to_attr="_superprojects", |
| 192 | + ), |
| 193 | + # Prefetch the canonical domain to avoid N+1 queries when using the resolver. |
| 194 | + Prefetch( |
| 195 | + "domains", |
| 196 | + Domain.objects.filter(canonical=True), |
| 197 | + to_attr="_canonical_domains", |
| 198 | + ), |
185 | 199 | )
|
186 | 200 |
|
187 | 201 | def create(self, request, *args, **kwargs):
|
|
0 commit comments