首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定期创建插槽

定期创建插槽
EN

Stack Overflow用户
提问于 2020-04-30 12:01:31
回答 1查看 129关注 0票数 0

我需要根据一些歌曲创造时隙。例如,如果我的播放列表有5首歌曲,那么我们根据逻辑创建插槽的时间间隔,在这个例子中,60/5 = 12分钟,因为这里的歌曲数量是5。

我还提供了start_time和end_time。如果我提供start_time = 5:00 am and end_time = 6:00 am, total songs = 5

代码语言:javascript
复制
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

该模型由以下三个领域组成:

代码语言:javascript
复制
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)

我正在使用以下查询检查插槽是否存在:

代码语言:javascript
复制
SlotCreate.objects.filter(from_time=from_time,to_time=to_time,labelling=label).exists():
       errors.append("The Slot already exists "+"\n")

这里的问题是如果用户提供:

代码语言:javascript
复制
Start_time = 5:00
End_time = 6:00
Total songs = 3

当S1、S2、S3、S4、S5已经存在时,时隙已经存在于上面给定的时间间隔中。我上面检查的代码段未能将此情况确定为

代码语言:javascript
复制
S1: 5:00 - 5:20
S1: 5:20 - 5:40
S1: 5:40 - 6:00

有人能帮我吗?在这种情况下,我在这里少了什么?

更新1:

我已经编写了以下查询,但是午夜后无法为值进行锻炼。请提供一些帮助下面的查询,这样我们就可以检查插槽是否重叠,并在重叠时引发错误。

代码语言:javascript
复制
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()))):
EN

回答 1

Stack Overflow用户

发布于 2020-05-03 20:54:17

我想你是在找这样的东西:

代码语言:javascript
复制
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小时的范围,但是如果您的模型只存储时间值,则不支持这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61522909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档