Skip to content

Commit 1913e9a

Browse files
committed
Measurements PDF: Fix N+1 query
1 parent be4212d commit 1913e9a

File tree

2 files changed

+28
-11
lines changed

2 files changed

+28
-11
lines changed

gcampus/documents/templates/gcampusdocuments/documents/measurement_list.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,11 @@ <h3 class="measurementmeta-content color-secondary">{% translate "Time range" %}
114114
{% for measurement in measurements %}
115115
<div class="measurementdata-item">
116116
<span class="measurementdata-id">
117-
# {{ measurement.pk|stringformat:"05d" }}
117+
{{ measurement.pk|stringformat:"05d" }}
118118
</span>
119119
<i class="circle-icon water-icon {{ measurement.water.flow_type }}"></i>
120120
<span>
121-
{{ measurement.water_name }} ({{ measurement.time|date:"Y-m-d" }})
121+
{{ measurement.water_name }} ({{ measurement.time|date:"SHORT_DATETIME_FORMAT" }})
122122
</span>
123123
<br>
124124
<div class="measurementdata-parameters">

gcampus/documents/views/print.py

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,24 @@ class MeasurementListPDF(ListDocumentView):
115115
filename = gettext_lazy("gewaessercampus-measurement-list.pdf")
116116
context_object_name = "measurements"
117117
model = Measurement
118+
queryset = (
119+
Measurement.objects.order_by("time")
120+
.prefetch_related("parameters")
121+
.prefetch_related("parameters__parameter_type")
122+
.select_related("water")
123+
.only(
124+
"id",
125+
"location",
126+
"time",
127+
"water_id",
128+
"water__flow_type",
129+
"water__water_type",
130+
"water__name",
131+
"parameters__value",
132+
"parameters__parameter_type__name",
133+
"parameters__parameter_type__unit",
134+
)
135+
)
118136
filter: MeasurementFilterSet
119137

120138
def get_bbox(self) -> Tuple[float, float, float, float]:
@@ -155,17 +173,16 @@ def get_context_data(self, *, object_list=None, **kwargs):
155173
}
156174
if context_object_name is not None:
157175
context[context_object_name] = queryset
158-
kwargs["measurement_count"] = queryset.count()
176+
simple_queryset = queryset.all().prefetch_related(None)
177+
kwargs["measurement_count"] = simple_queryset.all().count()
159178
kwargs["water_count"] = (
160-
queryset.only("water").order_by().distinct("water").count()
161-
)
162-
kwargs["time_first"] = (
163-
queryset.only("time").values_list("time", flat=True).earliest("time")
179+
simple_queryset.all().only("water").order_by().distinct("water").count()
164180
)
165-
kwargs["time_last"] = (
166-
queryset.only("time").values_list("time", flat=True).latest("time")
167-
)
168-
points: List[Point] = queryset.all().values_list("location", flat=True)
181+
time_query = simple_queryset.all().only("time").values_list("time", flat=True)
182+
kwargs["time_first"] = time_query.all().earliest("time")
183+
kwargs["time_last"] = time_query.all().latest("time")
184+
185+
points: List[Point] = simple_queryset.all().values_list("location", flat=True)
169186
map_bytes: bytes
170187
clustered: bytes
171188

0 commit comments

Comments
 (0)