在特定日期后删除Django模型实例的最佳方法

问题描述:

我正在编写一个小应用程序,用户创建一个事件并指定事件发生的日期。事件日期过后,我想删除该事件实例。我目前的尝试是抛出一个函数,检查事件是否应该在事件页面视图中过期。我不确定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

您是否打算在活动过期后立即删除活动是否有人查看活动页面? – 2012-08-03 03:57:41

+0

你的'check_expiration'函数没问题,但是在'event_page'函数中调用它意味着过期事件会一直存在,直到用户为其中的一个加载了'event_page'(想象用户流;可能非常混乱!)。请参阅下面的其他方法。 – supervacuo 2012-08-03 04:13:23

如果您托管的是UNIX平台(GNU/Linux的,OSX,)上的应用程序,它可能是最好的利用cron,通用的系统工具,用于周期性运行的东西。

这需要实现您的到期代码作为custom management command

  1. 如果您还没有任何自定义管理已经命令,创建以下目录结构:

    yourapp/ 
        management/ 
        __init__.py (blank) 
        commands/ 
         __init__.py (blank) 
         expire_events.py 
    
  2. expire_events.py,沿着以下方向创建一个新班级:

    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,并且可以删除过期过期日期的任何事件。

要在使用cron定期运行这个(这些指令是GNU/Linux,但可以在其他UNIX以及工作的变种),运行sudo crontab -e并添加以下行:

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

(此将每5分钟运行一次任务;有关指定作业运行时间的信息,请参阅the crontab documentation

+0

好的,我猜这对于学习这种类型的东西并不会有什么伤害:)我在heroku上,他们推荐使用cron:https://devcenter.heroku.com/articles/scheduler。另外,芹菜呢? http://celeryproject.org/ – darko 2012-08-03 11:25:03

+0

是的,其中任何一个都可以工作(芹菜文档中的“周期性任务”部分)(http://packages.python.org/celery/userguide/periodic-tasks。 HTML))。对芹菜的一个警告是,你需要一直运行的“芹菜拍”来启动工作。 – supervacuo 2012-08-03 13:01:54