私のプロジェクトでは、ユーザはそれぞれのアイテムのアクションスケジュールを設定できます。この措置は、例えば、午前1時、毎日午前2時または毎週月曜日と水曜日の午後3時、午後6時および午前9時に行うことができます。だから、フォームは次のようになります。リソースを割くためにDjangoデータベースに週刊/日次スケジューリングを保存する
、最小限の時間が私はセロリのタスクどの時間ごとのチェックすべてのスケジュールを実行し、それが今のアクションを行う必要があるかどうかを確認することができます時間です。
私はデータベースにそのようなスケジュールを保存する最良の方法とそのようなモデルを作成する方法を理解しようとしています。
最初にやるべきことは、製品ごとにセロリの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に格納する方法は、パフォーマンスによってはおそらく最適ではありません。そのようなデータをモデルに保存する方法を知っていますか?