Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Django数据库中存储周/日计划_Django_Django Models - Fatal编程技术网

在Django数据库中存储周/日计划

在Django数据库中存储周/日计划,django,django-models,Django,Django Models,在我的项目中,用户可以为他们的每个项目设置行动计划。例如,可以在每周凌晨1点、每天凌晨2点或每周一和周三下午3点、下午6点和上午9点执行此操作。因此,表单可以如下所示: 为了节省资源,最短的时间是小时,这样我就可以运行芹菜任务,每小时检查一次所有的日程安排,看看它现在是否必须执行操作 我试图找出在数据库中存储此类计划的最佳方式,以及如何创建此类模型 我要做的第一件事是以字符串格式为每个产品存储类似芹菜cron tab的内容-'x x'-例如“hour='3,17,22',day'u of u

在我的项目中,用户可以为他们的每个项目设置行动计划。例如,可以在每周凌晨1点、每天凌晨2点或每周一和周三下午3点、下午6点和上午9点执行此操作。因此,表单可以如下所示:

为了节省资源,最短的时间是小时,这样我就可以运行芹菜任务,每小时检查一次所有的日程安排,看看它现在是否必须执行操作

我试图找出在数据库中存储此类计划的最佳方式,以及如何创建此类模型

我要做的第一件事是以字符串格式为每个产品存储类似芹菜cron tab的内容-
'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()
,