Создание слотов через равные промежутки времени - PullRequest
0 голосов
/ 30 апреля 2020

Мне нужно создать временные интервалы в соответствии с количеством песен. Например, s, если в моем плейлисте 5 песен, мы создаем временной интервал слотов по логикам c, 60/5 = 12 минут в этом примере, так как количество песен здесь было 5.

Я также предоставляю start_time и end_time. Вот если я предоставлю start_time = 5:00 am and end_time = 6:00 am, total songs = 5

S1: 5:00 - 5:12
S2: 5:12 - 5:24
S3: 5:24 - 5:36
S4: 5:36 - 5:48
S5: 5:48 - 6:00

Модель состоит из этих трех полей:

class SlotCreate(models.Model):
  from_time = models.TimeField(max_length=255, blank=True, null=True)
  to_time = models.TimeField(max_length=255, blank=True, null=True)
  songs = models.ManyToManyField('Song')
  labelling = models.ForeignKey('Labelling',blank=True, null=True)

Я проверяю, существует ли слот, с помощью следующего запроса:

SlotCreate.objects.filter(from_time=from_time,to_time=to_time,labelling=label).exists():
       errors.append("The Slot already exists "+"\n")

Проблема здесь в том, что если пользователь предоставляет:

Start_time = 5:00
End_time = 6:00
Total songs = 3

Тогда интервалы уже существуют в указанном выше временном интервале, поскольку S1, S2, S3, S4, S5 уже существуют. Часть кода, с которой я проверяю выше, не может определить этот случай как

S1: 5:00 - 5:20
S1: 5:20 - 5:40
S1: 5:40 - 6:00

Может ли кто-нибудь помочь мне, что мне здесь не хватает в условии?

Обновление 1:

Я написал следующий запрос, но не могу обработать значения после полуночи. Кто-нибудь может предложить некоторую помощь по приведенному ниже запросу, чтобы мы могли проверить, не перекрываются ли слоты, и вызвать ошибку при перекрытии.

SlotCreate.objects.filter(labelling = label).exclude((Q(from_time__gte=dateTimeA.time()) & Q(from_time__gte = dateTimeB.time())) | (Q(to_time__lte = dateTimeA.time()) & Q(to_time__lte = dateTimeB.time()))):

1 Ответ

0 голосов
/ 03 мая 2020

Я думаю, вы ищете что-то вроде этого:

timeA = dateTimeA.time()
timeB = dateTimeB.time()

label_filter = Q(labelling=label)
if timeA <= timeB:
    # Is either from_time OR to_time in the range?
    time_filter = Q(from_time__gte=timeA, from_time__lte=timeB)
    time_filter |= Q(to_time__gte=timeA, to_time__lte=timeB)
else:
    # Crosses midnight
    time_filter = (Q(from_time__gte=timeA) | Q(from_time__lte=timeB))
    time_filter |= (Q(to_time__gte=timeA) | Q(to_time__lte=timeB))

exists = SlotCreate.objects.filter(label_filter & time_filter).exists()

Для условия полуночи вы просто меняете значения, с которыми сравниваете. Q объект делает AND по умолчанию, поэтому вам не нужны дополнительные объекты Q, чтобы выполнить его в первом условии.

Замечание: очевидно, он не обрабатывает диапазоны, превышающие 24 часа, но ваша модель не поддерживает это, если хранит только значения времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...