2011-03-09 111 views
10

Necesito encontrar datos dentro de un cierto conjunto de parámetros Estoy construyendo un pequeño sistema de reserva, que permite al usuario ver qué vehículos están disponibles para reservar para su pequeño safari.django date filter gte y lte

El sistema tiene reservas que han sido ingresadas previamente o hechas previamente por un cliente.

Si de pickup_date = 2011-03-01 y dropoff_date = 2011-03-15 y corro una consulta con pickup=2011-03-09 y dropoff=2011-03-14 en mis puntos de vista como abajo, no devuelve ningún resultado para ver si se ha hecho una reserva en ese plazo una reserva.

views.py

def dates(request, template_name='groups/_dates.html'): 
    pickup=request.GET.get('pickup','None'); 
    dropoff=request.GET.get('dropoff','None'); 
    order = Order.objects.filter(pick_up__lte=pickup).filter(drop_off__gte=dropoff) 

    context = {'order':order,} 

    return render_to_response(template_name,context, 
     context_instance=RequestContext(request)) 

¿Alguna sugerencia sobre cómo hacer esto? ¿O debería estar buscando una forma alternativa de ejecutar esta consulta?

+1

¿quieres regresar con las reservas entre recoger y dejar? en caso afirmativo, ¿no debería ser Order.objects.filter (pick_up__gte = pickup, drop_off__lte = dropoff), por ejemplo, cualquier pedido entre o igual a 2011-03-09 y 2011-03-14? ¿O he entendido mal el requisito? – JamesO

+0

Bueno, si yo, el cliente, estoy buscando un vehículo y mis fechas son 2011-03-09, como recogida, y 2011-03-14, como devolución, y otra reserva ya está en el sistema que tiene una fecha de 2011-03-01, como recolección, y 2011-03-15, como devolución, quiero que el sistema me diga que este espacio de tiempo está ocupado. ¿Tiene más sentido ahora? – ApPeL

+0

Siempre recomendaría usar un formulario para desinfectar la entrada. –

Respuesta

17

Podría ser posible que, al pasar la cadena sin formato al conjunto de consulta, no tenga el formato correcto, intente convertir las cadenas en objetos de fecha y hora.

Más tarde puede intentar usar el rango de búsqueda es más eficiente en algunos motores de DB y más fácil de leer y codificar.

from django.db.models import Q 

start_date = datetime.date(2005, 1, 1) 
end_date = datetime.date(2005, 3, 31) 
orders = Order.objects.filter(drop_off__gte=start_date, pick_up__lte=end_date) 
# Or maybe better 
orders = Order.objects.filter(Q(drop_off__gte=start_date), Q(pick_up__lte=end_date)) 
Cuestiones relacionadas