我需要根据一些歌曲创造时隙。例如,如果我的播放列表有5首歌曲,那么我们根据逻辑创建插槽的时间间隔,在这个例子中,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()))):发布于 2020-05-03 20:54:17
我想你是在找这样的东西:
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小时的范围,但是如果您的模型只存储时间值,则不支持这一点。
https://stackoverflow.com/questions/61522909
复制相似问题