通过Python/Django在数据库中表示计划的最佳方式是什么?

通过Python/Django在数据库中表示计划的最佳方式是什么?,python,django,django-models,backup,django-forms,Python,Django,Django Models,Backup,Django Forms,我正在用Python编写一个备份系统,带有Django前端。我决定以一种稍微奇怪的方式实现调度——客户机将轮询服务器(每10分钟左右),以获取需要执行的备份列表。服务器仅在达到备份时间时才会响应。这是为了保持系统平台的独立性,这样我就不会依赖于cronjobs之类的东西。因此,Django前端(公开XML-RPC API)必须将计划存储在数据库中,并解释该计划以决定客户端是否应该开始备份 目前,计划使用3个字段存储:天、小时和分钟。这些是逗号分隔的整数列表,表示一周中的几天(0-6)、一天中的几

我正在用Python编写一个备份系统,带有Django前端。我决定以一种稍微奇怪的方式实现调度——客户机将轮询服务器(每10分钟左右),以获取需要执行的备份列表。服务器仅在达到备份时间时才会响应。这是为了保持系统平台的独立性,这样我就不会依赖于cronjobs之类的东西。因此,Django前端(公开XML-RPC API)必须将计划存储在数据库中,并解释该计划以决定客户端是否应该开始备份

目前,计划使用3个字段存储:天、小时和分钟。这些是逗号分隔的整数列表,表示一周中的几天(0-6)、一天中的几小时(0-23)和一小时中的几分钟(0-59)。决定客户机是否应该开始备份是一项效率极低的操作——Python必须在所有的日子中循环,从过去的7天开始,然后是小时,然后是分钟。我已经做了一些优化,以确保它不会循环太多-但仍然

虽然实现相当丑陋,但它的效果相对较好。我的问题是如何通过前端的HTML表单显示和解释这些信息。目前,我只有大量的多选字段列表,这显然不能很好地工作


有谁能提出一种更有效、更易于用HTML格式表示的方法来实现日程安排吗?

请看一看。它有一个非常好的界面,可以在各种时间间隔安排作业。你或许可以从中借鉴一些想法。它依赖于,您可能会发现这对于指定重复事件也很有用。

请查看。它有一个非常好的界面,可以在各种时间间隔安排作业。你或许可以从中借鉴一些想法。它依赖于,您可能会发现这对于指定重复事件也很有用。

您的问题有点含糊不清,您的意思是:“在每个星期天、星期一和星期五的时间X备份。”

如果是,请使用将定期计划存储为整数:

假设您希望在星期天、星期一和星期五进行上述备份。将一周中的几天编码为整数(以二进制表示):

要确定今天(如星期五)是否是备份日,只需按位执行

>>> 0b1100010 & 0b0000010 != 0
True
要获取整数形式的当前日期,需要将其偏移1,因为
weekday()
假设一周从周一开始:

current_day = (timezone.now().weekday() + 1) % 7
总之,
计划
对象的模式如下所示:

class Schedule(models.Model):
    days_recurrence = models.PositiveSmallIntegerField(db_index=True)
    time = models.TimeField()

使用此模式,您需要在一天中的每个时间备份一个新的
Schedule
对象。这是一种快速查找,因为按位操作大约需要2个周期,并且由于您正在索引字段
days\u recurrence
,因此最坏情况下的day查找是
O(logn)
,这将大大降低您的复杂性。如果您想从中获得更高的性能,还可以使用位掩码一小时,然后存储分钟。

您的问题有点含糊不清,您的意思是:“在每个星期天、星期一和星期五的时间X备份。”

如果是,请使用将定期计划存储为整数:

假设您希望在星期天、星期一和星期五进行上述备份。将一周中的几天编码为整数(以二进制表示):

要确定今天(如星期五)是否是备份日,只需按位执行

>>> 0b1100010 & 0b0000010 != 0
True
要获取整数形式的当前日期,需要将其偏移1,因为
weekday()
假设一周从周一开始:

current_day = (timezone.now().weekday() + 1) % 7
总之,
计划
对象的模式如下所示:

class Schedule(models.Model):
    days_recurrence = models.PositiveSmallIntegerField(db_index=True)
    time = models.TimeField()

使用此模式,您需要在一天中的每个时间备份一个新的
Schedule
对象。这是一种快速查找,因为按位操作大约需要2个周期,并且由于您正在索引字段
days\u recurrence
,因此最坏情况下的day查找是
O(logn)
,这将大大降低您的复杂性。如果您想从中获得更高的性能,还可以使用位掩码一小时,然后存储分钟。

您能稍微澄清一下情况吗?什么是备份-客户端上的数据?您不只是将数据库中的下一个备份日期存储为datetime,或者将备份间隔存储为timedelta,这有什么原因吗?如果你节省了上次备份的时间,以及所需的时间增量,计算起来会很快。我不知道为什么我没有想到这一点。我打算采用类似cron的语法,但后来完全陷入了这条道路。现在的计划是询问用户下一个运行日期/时间,并将其与增量一起存储。然后我可以使用一个漂亮的jQueryUIDatePicker小部件:)。谢谢你的帮助!你能稍微澄清一下情况吗?什么是备份-客户端上的数据?您不只是将数据库中的下一个备份日期存储为datetime,或者将备份间隔存储为timedelta,这有什么原因吗?如果你节省了上次备份的时间,以及所需的时间增量,计算起来会很快。我不知道为什么我没有想到这一点。我打算采用类似cron的语法,但后来完全陷入了这条道路。现在的计划是询问用户下一个运行日期/时间,并将其与增量一起存储。然后我可以使用一个漂亮的jQueryUIDatePicker小部件:)。谢谢你的帮助+1用于django chronograph,它使用dateutil提供丰富的时间规范语言。dateutil看起来非常强大,但我认为我不会在这个项目中使用它来降低依赖性。用上面描述的方法,我不需要比一点数学更复杂的东西+1表示django计时器,它使用dateutil提供丰富的时间规范语言