【问题标题】:Creation of slots at regular intervals定期创建插槽
【发布时间】:2020-04-30 12:01:31
【问题描述】:

我需要根据歌曲的数量创建时间段。例如,如果我的播放列表有 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()))):

【问题讨论】:

  • 您是否正在尝试确定是否有任何现有插槽与用户给出的范围重叠?您的过滤器正在执行精确操作,但需要在时间上使用 __gte 和 __lte 来检查范围。如果担心跨越午夜,您可以使用 Q 对象来创建更复杂的条件。有时考虑一下您的 SQL 会是什么样子会有所帮助。
  • 是的,@JoeHolloway,我正在确定是否有任何现有插槽与用户给出的范围重叠。但是,当我们还考虑午夜值时,您是否可以在更新 1 中为查询提供一些帮助?

标签: python django


【解决方案1】:

我认为您正在寻找这样的东西:

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 小时的范围,但如果仅存储时间值,您的模型不支持。

【讨论】:

    猜你喜欢
    • 2013-05-31
    • 2020-04-03
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多