2012-08-03 31 views
8

Estoy escribiendo una pequeña aplicación donde el usuario crea un evento y especifica la fecha en que ocurrirá ese evento. Después de que la fecha del evento haya pasado, quiero eliminar esa instancia de evento. Mi intento actual es lanzar una función que verifica si el evento debe caducar en la vista de la página del evento. No estoy seguro de si la función expiration_check se está comprobando de forma correcta, ni estoy seguro de si funcionará solo una función en la vista.La mejor manera de eliminar una instancia de modelo django después de una fecha determinada

Aquí es mi punto de vista y la función de expirar:

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

colecciono la fecha por parte del usuario y almacenarlo en un DateTime archivado: date = models.DateField()

Avísame si lo hay se necesitan más detalles. Cualquier idea es apreciada, ¡gracias!

+0

¿Su intención es que el evento se elimine inmediatamente después de que haya expirado si alguien visita la página del evento o no? –

+0

Su función 'check_expiration' está bien, pero llamarla a la función' event_page' significa que los eventos caducados se mantendrán hasta después de que un usuario cargue 'event_page' para uno de ellos (imagine el flujo de usuarios, ¡probablemente bastante confuso!). Vea a continuación un enfoque diferente. – supervacuo

Respuesta

12

Si usted es anfitrión de su aplicación en una plataforma UNIX (GNU/Linux, OSX, etc. ), es probablemente la mejor manera de hacer uso de cron, la utilidad de sistema genérico para el funcionamiento de las cosas de forma periódica.

Esto requiere la implementación de su código de caducidad como custom management command:

  1. Si usted no tiene ningún comando de administración personalizado ya, cree la siguiente estructura de directorios:

    yourapp/ 
        management/ 
        __init__.py (blank) 
        commands/ 
         __init__.py (blank) 
         expire_events.py 
    
  2. En expire_events.py, cree una nueva clase en la línea de lo siguiente:

    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. Ahora debería poder ejecutar ./manage.py expire_events y borrar cualquier evento con fechas de caducidad en el pasado.

Para ejecutar esto a intervalos regulares usando cron (estas instrucciones son para GNU/Linux, pero también pueden trabajar en otras variantes de Unix), ejecute sudo crontab -e y añadir la siguiente línea:

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

(este ejecutaría la tarea cada 5 minutos; consulte the crontab documentation para obtener asesoramiento sobre cómo especificar tiempos de ejecución de trabajos)

+0

Ok, supongo que no estaría de más saber de este tipo de cosas :) Estoy en heroku y lo recomiendan a través de cron: https://devcenter.heroku.com/articles/scheduler. Además, ¿qué pasa con el apio? http://celeryproject.org/ – darko

+0

Sí, cualquiera de ellos funcionaría (hay una sección de [documentos de apio sobre "tareas periódicas"] (http://packages.python.org/celery/userguide/periodic-tasks. html)). Una advertencia con el apio es que necesitarías 'apio de cebo 'corriendo todo el tiempo para dar inicio a los trabajos. – supervacuo

Cuestiones relacionadas