定期开辟槽位

问题描述 投票:0回答:1

我需要根据歌曲的数量来创建时间段。例如,s如果我的播放列表有5首歌曲,那么我们通过逻辑创建时间间隔的插槽,605 = 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

Model由这三个字段组成。

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()))):
python django
1个回答
0
投票

我想你要找的是这样的东西。

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小时的范围,但如果你的模型只存储时间值,那么它就不支持。

© www.soinside.com 2019 - 2024. All rights reserved.