- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在构建 Django 应用程序,旨在维护 10K+ 人(以及 future 更多人)的时间表(时间表)。基本上,问题陈述如下:每个人都有单独的时间表和明年的免费时段。它是离散的,步长为 15 分钟。我需要开发模型架构(这将暗示底层的数据库设计)来执行以下操作:
例如,我有约翰,他在 11 月 14 日上午 8 点到下午 14 点有空,萨拉在 11 月 14 日上午 10 点到上午 11 点有空。如果我查询 John 的空闲时间段,我想得到“11 月 14 日上午 8 点至下午 14 点”。如果我查询“早上 8 点到 11 点有空的人”,我会得到约翰,因为萨拉要到上午 10 点才有空。如果我查询“上午 10 点到 11 点有空的人”,我想同时获得 John 和 Sara。我考虑过这个问题,我的想法如下。
解决方案 №1:我们创建一个 FreeTimeSlot 模型,它将存储有关每 15 分钟时间跨度间隔的信息,并建立与人的整个关系。
class Person(models.Model):
name = models.CharField(max_length=32, null=False, blank=False)
free_slots = models.ManyToManyField(FreeTimeSlot, related_name='tutor_set', null=True, blank=True, through='PersonSlot')
class TimeSlot(models.Model):
time = models.DateTimeField(db_index=True) #perhaps other field type
class PersonSlot(models.Model):
person = models.ForeignKey(Person)
timeslot = models.ForeignKey(Slot)
class Meta:
db_table = 'person_free_slots'
unique_together = (('timeslot', 'person'))
我们为来年的每 15 分钟间隔创建 365*24*4 TimeSlot 模型,如果有人在他的日程安排中表示空闲时间,我们将添加与该 TimeSlot 的关系。使用这种架构,为个人获取空闲时间段就像通过管理器一样简单:person.free_time_slots让所有人在特定时间(例如 10-10:45)有空也很容易,像这样平滑:
timeslots = TimeSlot.objects.filter(time__in=['10:00', '10:15', '10:30'])
PersonSlot.objects.filter(timeslot__in=timeslots).values('person')
解决方案 №2:我们避免为每个时间段创建模型,而是在 PersonTime 模型本身中保留日期:
class Person(models.Model):
name = models.CharField(max_length=32, null=False, blank=False)
class TimeSlot(models.Model):
person = models.ForeignKey(Person, related_name='slots')
time_start = models.DateTimeField(db_index=True)
time_end = models.DateTimeField(db_index=True)
获取空闲时间段列表也很容易(person.slots)。让所有人在特定时间(例如 10-10:45)有空就像:
TimeSlot.objects.filter(time_start__gte="10:00", time_end__lte="10:45").values('person')
此解决方案不适用于相交间隔,我不确定查询间隔的索引时间(在同一字段上使用 gte 和 lte 比较)是否有效,并且工作速度很快。如果可以的话,我会使用 Postgres。我还用伪代码编写了时间查询以简化代码。
所以我的问题如下,django 开发人员将如何实现此功能以提供大数据查询的速度?我将不胜感激关于我当前解决方案或新想法的可能警告/好处的建议。
最佳答案
让我们把这个问题分成两部分。
考虑对与时隙相关的数据进行编码。如果您需要 15 分钟的精度,则您有 96 个槽(一天 1 小时 * 24 小时内有 4 个槽),任何一天的持续时间为 15 分钟。每个槽可以有两种可能的状态之一:1 - 槽空闲,0 - 槽忙(或者反之亦然,如果你愿意的话)。因此,您可以用 0
的字符串表示每日时间表。 s 和 1
秒。例如,字符串(为了便于阅读而添加的空格)0000 0000 0000 0000 0000 0000 0000 0000 0000 1110 0000 ...
表示 00:00AM 到 09:00AM 之间的繁忙时间段(晚上没有人工作),然后是 9:00AM 到 9:45AM 之间的空闲时间段(连续三个 1
s),然后是繁忙时间时段从上午 9:45 开始。
所以,你可以这样写你的模型:
class Person(models.Model):
name = models.CharField(max_length=32)
class DailySchedule(models.Model):
person = models.ForeignKey(Person, related_name='day_schedule')
date = models.DateField()
schedule = models.CharField(max_length=96)
所以,我们编码了有关可用/繁忙时隙的信息,但我们如何从数据库中提取它呢?幸运的是,Django 有 regex
现场查找的可能性!幸运的是,Django 1.4 支持它!!
因此,为了查找在特定时间段内有空的人员,您可以使用 DailySchedule.objects.filter(date=date, schedule__regex=r'<expression>')
.由于使用什么表达式来提取不同的时间范围并不明显,因此我们需要一个支持函数:
def time_slot_to_regex(start_time, end_time):
# times should be in HH:MM format
start_hour, start_minutes = start_time.split(':')
end_hour, end_minutes = end_time.split(':')
slots_before_needed_time = (int(start_hour)*4 + int(start_minutes)/15)
# compute how many hours are between given times and find out nr of slots
hour_duration_slots = (int(end_hour) - int(start_hour)) * 4 # 4 slots in each hour
# adjust nr of slots according to minutes in provided times.
# e.g. 9:30 to 10:45 - we have 10-9=1 hour, which is 4 time slots,
# but we need to subtract 2 time slots, because we don't have 9:00 to 10:00,
# but 9:30 to 10:00 so we subtract 30/15=2 timeslots and add what is left
# from the incomplete hour of 10:45 time, which is 45/15 minutes = 3 slots
minute_duration_slots = int(end_minutes)/15 - int(start_minutes)/15
total_duration = hour_duration_slots + minute_duration_slots
regular_expression = r'^[01]{%d}1{%d}' % (slots_before_needed_time, total_duration)
return regular_expression
让我们弄清楚这个函数是如何工作的
假设我们想找出上午 9:15 到 9:45 之间有空的人员。我们调用slots_expression = time_slot_to_regex('9:15', '9:45')
计算:
slots_before_needed_time = 37
,我们将 9 乘以 4 + 15/15 得到。这是我们不关心的槽数,它将进入我们的 regular_expression
的第一部分。字符串 - '^[01]{37}'
hour_duration_slots = 0
, 因为两个时间值中的小时是相同的minute_duration_slots = 2
,我们通过从 45/15 中减去 15/15 得到regular_expression
中将其设置为 1 ,从而获得'^[01]{37}1{2}'
现在我们可以将这个正则表达式提供给我们的过滤器,获得DailySchedule.objects.filter(schedule__regex=slots_expression)
瞧!我们得到了结果。
我已经描述了编码数据的原理,但是没有提到编码它的过程。这可以通过使用另一个支持函数轻松完成,该函数接受一串现有的繁忙/可用插槽和一个 start_date
。和 end_date
为此更新现有计划。如果您也需要描述此方法,请告诉我。
^[01]{36}1{4}[01]{24}1{4}
将查找上午 9 点到上午 10 点和下午 4 点到下午 5 点有空的人<关于django - Django 模型实现时间表(调度)功能的架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33701418/
我有以下格式的一些数据: 薪水 代码及时 1690 09:03:00 1690 09:13:00 1690 09:07:00 1691 08:48:00 1691 08:52:00 1691 08:5
在基于 jsp 和 servelet 的 Web 应用程序中实现类似 cron 的调度程序的最佳方法是什么?使用“定时器服务”遇到了一个选项。任何其他替代方案或对计时器服务的任何评论? 提前致谢 沙米
好吧,我对 MySQL 和数据库总体来说还很陌生。我想在一段时间后对数据库进行更新。让我解释一下。 所以为了练习,我正在用 php 构建一个游戏,在这个游戏中你将能够升级东西。比如说一栋建筑,从1级升
我想为每个用户创建一个典型的学校时间表。 最终产品应如下所示: +----+---------+---------+-----------+----------+--------+ | h | Mo
我的表格: timetable +----+---------+-------+--------+---------+---------+------+ | id | user_id | s_day
我的网站涉及安排重复类(class)和事件。目前,我已经使用 php 和 javascript 构建了一个表,该表逐个时间段扫描我的 mysql 数据库,每天查看是否有安排的事件或时间段是否空闲。 它
我有一个关于日程安排的问题。我需要为约会制作一个时间表生成器。这是目前的情况。 P1 与 P2 有约会 A。 P3和P4有个约会B。 等等…… 预约 A 大约需要 15 分钟 B约需40分钟 (时长视
我有一个配置如下的 celery 时间表: CELERYBEAT_SCHEDULE = { "runs-every-30-seconds": { "task": "tasks.
我想在“每个月的最后一天 10:15”和“每个月的第一个星期日”运行 spring scheduler 作业 - 我在下面尝试过 - 但它在初始化 spring 上下文时出错: org.springf
如何在运行时检查 openmp 计划? 我使用并行循环和运行时计划编译我的代码 #pragma omp parallel for schedule(runtime) collapse(2) for(j
我已经制作了一个 Android 应用程序,并且它已成功编译,没有任何错误。但是当我在 Android 手机中运行应用程序时,它不会显示所需的输出。 这是我的 MainActivity.java: p
经过一天的痛苦,我终于将数据放入了日程安排事件中。 我现在尝试在单击事件时设置事件,它使用数据变量加载新页面。 这是 xhtml 还有 Java public void redirec
我正在使用 Primefaces Schedule 组件在我的网络应用程序中呈现事件。但我需要对他耍点小花招。对于每个呈现的事件,我需要显示一个包含事件详细信息的工具提示。使用 window.onlo
我想设置一个 crontab 表达式,每 20 分钟启动一次作业,并且它将按照时间表运行 周一至周五上午 7 点至 30 点至晚上 8 点,周六上午 7 点至 30 点至下午 4 点 到目前为止我有以
这是我根据用户输入创建表格的代码: const err = "the valid input is a number between 5 and 20, please refresh your pag
有没有办法在 HighCharts 中制作与此类似的时间线/时间表? https://developers.google.com/chart/interactive/docs/gallery/time
在关于 AES key 表的教程中,我看到 key 表的操作(旋转、rcon、s-box)应用于一个 4 字节的字。你能解释一下这个字从哪里来吗?我明白我从 128 位长的 key 中提取它。 key
SQL Server 作业/时间表 - 美国与英国夏令时调整 我们有一个基于英国的服务器,它需要在 16:30(美国中部时间 - 这可能看起来很奇怪,但这是因为一些数据的可用性)运行 SQL 代理作业
我有一个 quartz 作业,每天下午 3 点(服务器时间)运行。我想做的是让它在下午 3 点运行,但针对美国的每个时区。 quartz 作业会触发一封电子邮件给我的用户,我希望每个人都能在他们的时间
我想以一种非常简单的方式展示电视指南时间线,但我对此真的很陌生,所以我希望有人可以帮助我,我不想要太复杂的东西,而且我已经在网络上搜索并且我发现非常复杂的时间线,有很多我真的不需要的功能,我只想显示当
我是一名优秀的程序员,十分优秀!