2016-11-05 27 views
0

在我的項目中,用戶可以爲他們的每個項目設置行動計劃。例如,每週凌晨1點,凌晨2點或每週一和週三下午3點,6點和9點,可以執行此操作。所以,形式可以是這樣的:在Django數據庫中存儲每週/每日安排

enter image description here

爲了騰出資源,最小時間爲小時,所以我可以運行芹菜任務,每隔一小時檢查所有日程安排,看看它現在要做的一個動作。

我想弄清楚什麼是最好的方式來存儲這樣的時間表在數據庫中,以及如何使這樣的模型。

我要做的第一件事就是爲每個產品以字符串格式儲存諸如芹菜克倫標籤之類的東西 - 'x x x x x' - 例如"hour='3,17,22', day_of_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) 

正如你可以看到有兩個問題。這種模式不能爲不同的日子設置不同的時間,而根據性能,在調度器中存儲這些數據的方式可能不是最好的。你知道如何更好地將這些數據存儲在模型中嗎?

回答

2

爲什麼不在一個小時內使用一個Integer字段,以及一個CharField爲一天中的某一天選擇?

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> 
相關問題