2012-08-03 3 views
8

私はユーザーがイベントを作成し、イベントが発生する日付を指定する小さなアプリケーションを書いています。イベントの日付が過ぎた後、そのイベントのインスタンスを削除します。私の現在の試みは、イベントページビューでイベントが期限切れになるかどうかをチェックする関数を投げています。私は、expiration_check関数が正しい方法でチェックしているかどうか確かではありません。また、ビュー内の関数を持つだけでイベントが機能するかどうかは確かではありません。提出された特定の日付の後にDjangoモデルのインスタンスを削除する最も良い方法

def event_page(request, name): 
    event = Event.objects.get(name=name) 

    check_expiration(event) 

    if request.method == "POST": 
     form = GuestForm(request.POST) 
     if form.is_valid(): 
      Guest = form.save(commit=False) 
      Guest.event = event 
      Guest.save() 
      return redirect(event) 
    else: 
     form = GuestForm() 
     return render(request, "event_page.html", {"form": form, "event": event, }) 


def check_expiration(event): 
    now = datetime.datetime.now() 

    if event.date < now: #if the event date has past 
     event.delete() 

私は、ユーザーからの日付を収集したDateTimeに格納します:ここで

が私の見解で、機能を有効期限が切れる日付= models.DateFieldを()

があれば、私に教えてくださいさらなる詳細が必要です。どんな洞察もありがとう、ありがとう!

+0

誰かがイベントページを閲覧したかどうかを期限切れにした直後に、そのイベントを削除するつもりはありますか? –

+0

あなたの 'check_expiration'関数はうまくいますが、' event_page'関数で呼び出すと、期限切れのイベントはユーザが 'event_page'をロードするまで保持されます(ユーザーの流れを想像してください;おそらくかなり混乱します)。別のアプローチについては以下を参照してください。 – supervacuo

答えて

12

あなたはUNIXプラットフォーム(GNU/Linuxでは、OSX、など)上でアプリケーションをホスティングしている場合、それはcronの使用、定期的に物事を実行するための汎用的なシステムのユーティリティを作るために、おそらく最善です。

これはcustom management commandとしてあなたの有効期限コードを実装する必要があります。

  1. あなたが任意のカスタム管理がまだコマンドを持っていない場合は、次のディレクトリ構造を作成:expire_events.py

    yourapp/ 
        management/ 
        __init__.py (blank) 
        commands/ 
         __init__.py (blank) 
         expire_events.py 
    
  2. を、次の行に沿って新しいクラスを作成します。

    from django.core.management.base import NoArgsCommand 
    
    class Command(NoArgsCommand): 
    
        help = 'Expires event objects which are out-of-date' 
    
        def handle_noargs(self): 
         print Event.objects.filter(date__lt=datetime.datetime.now()).delete() 
    
  3. ./manage.py expire_eventsを実行して、過去の有効期限のあるイベントを削除することができます。 sudo crontab -eを実行して、次の行を追加し、(これらの命令は、GNU/Linux用ですが、他のUNIXの変種に取り組むこと)cronを使用して定期的にこれを実行するには

*/5 * * * * /path/to/your/django/app/manage.py expire_events 

を(このジョブ実行時間の指定に関するアドバイスについては、the crontab documentationを参照してください)

+0

さて、私はそれがこのタイプのことについて学ぶことを傷つけることはないと思う:)私はherokuにあり、cron:https://devcenter.heroku.com/articles/schedulerでこれをお勧めします。また、セロリはどうですか? http://celeryproject.org/ – darko

+0

これらのいずれかが動作します(「定期的なタスク」に関するセロリドキュメントのセクションがあります)(http://packages.python.org/celery/userguide/periodic-tasks。 html))。セロリとの注意点の一つは、セクレタリビートが常に仕事を開始する必要があるということです。 – supervacuo

関連する問題