在Django数据库中存储周/日计划
在我的项目中,用户可以为他们的每个项目设置行动计划。例如,可以在每周凌晨1点、每天凌晨2点或每周一和周三下午3点、下午6点和上午9点执行此操作。因此,表单可以如下所示: 为了节省资源,最短的时间是小时,这样我就可以运行芹菜任务,每小时检查一次所有的日程安排,看看它现在是否必须执行操作 我试图找出在数据库中存储此类计划的最佳方式,以及如何创建此类模型 我要做的第一件事是以字符串格式为每个产品存储类似芹菜cron tab的内容-在Django数据库中存储周/日计划,django,django-models,Django,Django Models,在我的项目中,用户可以为他们的每个项目设置行动计划。例如,可以在每周凌晨1点、每天凌晨2点或每周一和周三下午3点、下午6点和上午9点执行此操作。因此,表单可以如下所示: 为了节省资源,最短的时间是小时,这样我就可以运行芹菜任务,每小时检查一次所有的日程安排,看看它现在是否必须执行操作 我试图找出在数据库中存储此类计划的最佳方式,以及如何创建此类模型 我要做的第一件事是以字符串格式为每个产品存储类似芹菜cron tab的内容-'x x'-例如“hour='3,17,22',day'u of u
'x x'
-例如“hour='3,17,22',day'u of u week='thu,fri'
。但我认为这很糟糕,因为我必须每小时解析每个字符串,这非常耗时
最后,我做了一个7列的模型——一天24列。有两个问题——这可能不是存储此类日程安排的最佳方式,第二个问题是,每一天(真实的)都会设置我不想要的相同时间
模型调度程序-每个产品都有自己的对象
class Scheduler(models.Model):
monday = models.BooleanField(default=False)
tuesday = models.BooleanField(default=False)
wednesday = models.BooleanField(default=False)
thursday = models.BooleanField(default=False)
friday = models.BooleanField(default=False)
saturday = models.BooleanField(default=False)
sunday = models.BooleanField(default=False)
hour_1 = models.BooleanField(default=False)
hour_2 = models.BooleanField(default=False)
hour_3 = models.BooleanField(default=False)
hour_4 = models.BooleanField(default=False)
hour_5 = models.BooleanField(default=False)
hour_6 = models.BooleanField(default=False)
hour_7 = models.BooleanField(default=False)
hour_8 = models.BooleanField(default=False)
hour_9 = models.BooleanField(default=False)
hour_10 = models.BooleanField(default=False)
hour_11 = models.BooleanField(default=False)
hour_12 = models.BooleanField(default=False)
hour_13 = models.BooleanField(default=False)
hour_14 = models.BooleanField(default=False)
hour_15 = models.BooleanField(default=False)
hour_16 = models.BooleanField(default=False)
hour_17 = models.BooleanField(default=False)
hour_18 = models.BooleanField(default=False)
hour_19 = models.BooleanField(default=False)
hour_20 = models.BooleanField(default=False)
hour_21 = models.BooleanField(default=False)
hour_22 = models.BooleanField(default=False)
hour_23 = models.BooleanField(default=False)
hour_24 = models.BooleanField(default=False)
每小时调用一次的任务
@app.task()
def check_for_actions():
day = datetime.today().weekday()
hour = datetime.now().hour
# get all schedulers for this day
if day==0:
scheduled_this_day = models.Scheduler.objects.filter(monday=True)
elif day==1:
scheduled_this_day = models.Scheduler.objects.filter(tuesday=True)
elif day==1:
scheduled_this_day = models.Scheduler.objects.filter(wednesday=True)
elif day==1:
scheduled_this_day = models.Scheduler.objects.filter(thursday=True)
elif day==1:
scheduled_this_day = models.Scheduler.objects.filter(friday=True)
elif day==1:
scheduled_this_day = models.Scheduler.objects.filter(saturday=True)
elif day==1:
scheduled_this_day = models.Scheduler.objects.filter(sunday=True)
#filter schedulers for this hour
if hour==1:
scheduled_this_hour = scheduled_this_day.filter(hour_1=True)
elif hour==2:
...
for product in [x.product for x in scheduled_this_hour]:
do_action(product)
正如你所看到的,有两个问题。该模型不能为不同的日期设置不同的小时数,根据性能,在调度器中存储此类数据的方式可能不是最好的。您知道如何在模型中更好地存储此类数据吗?为什么不在小时中使用一个整数字段,在星期几中使用一个带选项的字符字段
from django.core.validators import MaxValueValidator
class Scheduler(models.Model):
day_of_week = models.CharField(default='Monday',
choices=(('monday', 'Monday'), ('tuesday', 'Tuesday')...))
hour = models.PositiveSmallIntegerField(validators=[MaxValueValidator(24)])
芹菜:
# I prefer arrow for formatting dates/times
import arrow
@app.task()
def check_for_actions():
weekday = arrow.utcnow().format('dddd') # Monday, Tuesday, etc
hour = datetime.now().hour
scheduled = models.Scheduler.objects.filter(day_of_week=weekday).filter(hour=hour)
至于
此模型无法为不同的天设置不同的小时
这个模型不能,但它可以与您计划的任何内容有关系
class Scheduler(models.Model):
thing_to_schedule = models.ForeignKey('ThingToSchedule')
day_of_week = models.CharField(default='Monday',
choices=(('monday', 'Monday'), ('tuesday', 'Tuesday')...))
hour = models.PositiveSmallIntegerField(validators=[MaxValueValidator(24)])
然后,ThingToSchedule
有一个包含所有需要运行时间的计划集
schedules = ThingToSchedule.schedule_set.all()
<Monday at 3>, <Tuesday at 6>
schedules=ThingToSchedule.schedule\u set.all()
,