11"""Beat Scheduler Implementation."""
2+ from __future__ import annotations
3+
24import datetime
35import logging
46import math
1517from celery .utils .time import maybe_make_aware
1618from django .conf import settings
1719from django .core .exceptions import ObjectDoesNotExist
18- from django .db import close_old_connections , transaction
20+ from django .db import close_old_connections , connection , transaction
1921from django .db .models import Case , F , IntegerField , Q , When
2022from django .db .models .functions import Cast
2123from django .db .utils import DatabaseError , InterfaceError
@@ -340,7 +342,7 @@ def _get_crontab_exclude_query(self):
340342 + 24
341343 ) % 24
342344 )
343- for timezone_name in self ._get_unique_timezone_names ()
345+ for timezone_name in self ._get_unique_timezones ()
344346 ],
345347 # Default case - use hour as is
346348 default = F ('hour_int' )
@@ -359,11 +361,25 @@ def _get_crontab_exclude_query(self):
359361
360362 return exclude_query
361363
362- def _get_unique_timezone_names (self ):
363- """Get a list of all unique timezone names used in CrontabSchedule"""
364- return CrontabSchedule .objects .values_list (
365- 'timezone' , flat = True
366- ).distinct ()
364+ def _get_unique_timezones (self ) -> set [ZoneInfo ]:
365+ """Get a set of all unique timezones used in CrontabSchedule"""
366+ # sqlite does not support distinct on a column
367+ if connection .vendor == 'sqlite' :
368+ return set (
369+ CrontabSchedule .objects .values_list (
370+ 'timezone' , flat = True
371+ )
372+ )
373+
374+ return set (
375+ CrontabSchedule .objects .order_by (
376+ 'timezone'
377+ ).distinct (
378+ 'timezone'
379+ ).values_list (
380+ 'timezone' , flat = True
381+ )
382+ )
367383
368384 def _get_timezone_offset (self , timezone_name ):
369385 """
0 commit comments