diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index ce6d5f86722903d67b65f39be3285ba428f0f1cc..f61c4ed035d8c3668f3afb3ff78315b282d9ecb5 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -20,6 +20,7 @@ Fixed
 * Preference section verbose names were displayed in server language and not
   user language (fixed by using gettext_lazy).
 * Affected groups and persons in substitutions list were displayed multiple times.
+* ``lessons_on_day`` didn't work as expected if a person has no lessons.
 
 `2.0b2` - 2021-06-02
 --------------------
diff --git a/aleksis/apps/chronos/model_extensions.py b/aleksis/apps/chronos/model_extensions.py
index 6cb98dad7d5c7ca732dfe800345abbf34f6320de..570df4e23a2f5706857d727c02ae13d8a6a91e18 100644
--- a/aleksis/apps/chronos/model_extensions.py
+++ b/aleksis/apps/chronos/model_extensions.py
@@ -83,7 +83,11 @@ def lesson_periods_as_teacher(self):
 @Person.method
 def lessons_on_day(self, day: date):
     """Get all lessons of this person (either as participant or teacher) on the given day."""
-    return LessonPeriod.objects.on_day(day).filter_from_person(self).order_by("period__period")
+    qs = LessonPeriod.objects.on_day(day).filter_from_person(self)
+    if qs:
+        # This is a union queryset, so order by must be after the union.
+        return qs.order_by("period__period")
+    return None
 
 
 @Person.method