Ваш вопрос немного двусмысленный - вы имеете в виду: "Резервировать каждое воскресенье, понедельник и пятницу во время X". ?
Если это так, используйте Битовая маска для сохранения повторяющегося расписания в виде целого числа:
Допустим, вам нужна резервная копия, как указано выше - по воскресеньям, понедельникам и пятницам. Кодируйте дни недели целым числом (представлено в двоичном формате):
S M T W T F S
1 1 0 0 0 1 0 = 98
Чтобы выяснить, является ли сегодня (например, пятница) резервным днем, просто сделайте побитовый and
:
>>> 0b1100010 & 0b0000010 != 0
True
Чтобы получить текущий день в виде целого числа, его необходимо сместить на единицу, поскольку weekday()
предполагает, что неделя начинается в понедельник:
current_day = (timezone.now().weekday() + 1) % 7
В итоге схема для вашего Schedule
объекта будет выглядеть примерно так:
class Schedule(models.Model):
days_recurrence = models.PositiveSmallIntegerField(db_index=True)
time = models.TimeField()
При использовании этой схемы вам потребуется новый объект Schedule
для каждого времени дня, в которое вы хотите выполнить резервное копирование. Это быстрый поиск, так как побитовая операция стоит около 2 циклов, и, так как вы индексируете поле days_recurrence
, у вас есть дневной поиск в худшем случае O(logn)
, который должен значительно сократить вашу сложность. Если вы хотите повысить производительность, вы также можете использовать битовую маску для час , а затем сохранить минуты.