Skip to content
Snippets Groups Projects
Verified Commit 96c78901 authored by mirabilos's avatar mirabilos Committed by mirabilos
Browse files

Use an SQL “WHERE NOT EXISTS” subclause.

This is correct performance-wise (avoids the need for the database to
build the entire result set before filtering; Django users reported a
speed-up of factor 5‥2000 over naïve solutions) and (accepted by Nik)
even more legible.
parent 3d6935a3
No related branches found
No related tags found
No related merge requests found
......@@ -2,7 +2,7 @@ from collections import OrderedDict
from typing import Optional
from django.contrib.auth.decorators import login_required
from django.db.models import Q
from django.db.models import Exists, OuterRef, Q
from django.http import HttpRequest, HttpResponse
from django.shortcuts import render
from django.views.decorators.cache import cache_page
......@@ -41,13 +41,17 @@ def lesson(request: HttpRequest, week: Optional[int] = None, period_id: Optional
request.POST or None, instance=lesson_documentation, prefix='leson_documentation')
# Create all missing personal notes about members of all groups in lesson
missing_persons = Person.objects.filter(
missing_persons = Person.objects.annotate(
no_personal_notes=~Exists(PersonalNote.objects.filter(
week=wanted_week,
lesson_period=lesson_period,
person__pk=OuterRef('pk')
))
).filter(
member_of__in=Group.objects.filter(pk__in=lesson_period.lesson.groups.all()),
is_active=True
).exclude(
personal_notes__week=wanted_week,
personal_notes__lesson_period=lesson_period
).all()
is_active=True,
no_personal_notes=True
)
PersonalNote.objects.bulk_create([
PersonalNote(person=person, lesson_period=lesson_period,
week=wanted_wek) for person in missing_persons
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment