2016-11-05 5 views
0

私のプロジェクトでは、ユーザはそれぞれのアイテムのアクションスケジュールを設定できます。この措置は、例えば、午前1時、毎日午前2時または毎週月曜日と水曜日の午後3時、午後6時および午前9時に行うことができます。だから、フォームは次のようになります。リソースを割くためにDjangoデータベースに週刊/日次スケジューリングを保存する

enter image description here

、最小限の時間が私はセロリのタスクどの時間ごとのチェックすべてのスケジュールを実行し、それが今のアクションを行う必要があるかどうかを確認することができます時間です。

私はデータベースにそのようなスケジュールを保存する最良の方法とそのようなモデルを作成する方法を理解しようとしています。

最初にやるべきことは、製品ごとにセロリのcronタブのような文字列を'x x x x x'(例:"hour='3,17,22', day_of_week='thu,fri'")で保存することでした。しかし、私はそれが非常に時間がかかる毎時各文字列を解析する必要があるので、それは悪いと思う。

最後に、7列 - 日と24列時間でモデルを作成しました。 2つの問題があります。それはおそらくそのようなスケジュールを保存するための最良の方法ではなく、2番目の事はすべての(真の)1日が私が欲しくない同じ時間を設定するということです。

MODELスケジューラ - すべての製品は、それが

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) 

次の2つの問題がある見ることができるように、毎時間

@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) 

呼ばれるTASK独自のオブジェクトのしています。このモデルでは、異なる日に異なる時間を設定することはできません。そのようなデータをSchedulerに格納する方法は、パフォーマンスによってはおそらく最適ではありません。そのようなデータをモデルに保存する方法を知っていますか?

答えて

2

1時間に1つの整数フィールドを使用し、曜日に1つの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> 
関連する問題