2017-11-22 3 views
1

Ich möchte Abfrage basierend auf drei Benutzereingaben filtern. Abfahrt Stadt, Ankunft Stadt und Datum. Abfahrt Stadt und Ankunft Stadt sind auf dem gleichen Tisch mit dem Namen Route, während das TravelDate ein Fremdschlüssel in Route ist. Mein ModellDjango-Filterabfrage mit Fremdschlüssel

class TravelDate(models.Model): 
    start_date = models.DateField(null = True) 
    interval = models.IntegerField(null = True) 



class Route(models.Model): 
    depart_city = models.CharField(max_length=50, null=True, blank=False) 
    arrive_city = models.CharField(max_length=50, null=True, blank=False) 
    driver = models.ForeignKey(Driver) 
    schedule = models.ForeignKey(Schedule) 
    traveldate = models.ForeignKey(TravelDate) 

Meine Ansicht

def newpage(request): 
    if 'origin' in request.GET and request.GET['origin']: 
     q = request.GET['origin'] 
     c = request.GET['dest'] 
     d = request.GET['travelDate'] 

     results = Route.objects.filter(depart_city=q, arrive_city=c) 

     return render(request,'busapp/newpage.html', {'results': results}) 
    else: 
     return render(request, 'busapp/newpage.html',{}) 

In Ansichten, wie kann ich eine Abfrage machen, die depart_city, arrive_city und Reisedatum dieser Strecken basierend auf Benutzer auswählen, wird inputed. Wenn ein Bus an diesem Datum von Stadt A nach Stadt B verfügbar ist, wird er berechnet, indem man so etwas macht if (d - TravelDate.start_date)% TravelDate.interval =0 und zeigt dann die Ergebnisse dem Benutzer an.

Ich kann das nicht richtig machen. Ich bin neu in Django und versuche zu lernen.

Antwort

1

Halten Intervall als Integer

views.py

from datetime import datetime, timedelta 

    q = request.GET['origin'] 
    c = request.GET['dest'] 
    d = request.GET['travelDate'] 
    # d format is '20171122',convert str to date 
    start_date = datetime.strptime(d, "%Y%m%d").date() 
    results = Route.objects.filter(depart_city=q, arrive_city=c) 
    routes = [] 
    for route in results: 
     if (start_date > date) and ((start_date - route.traveldate.start_date) % timedelta(days=route.traveldate.interva)) == timedelta(days=0): 
      routes.append(route) 
    return render(request,'busapp/newpage.html', {'results': routes}) 
+0

Vielen Dank für die schnelle Antwort. Ich bin mir nicht sicher, warum ich diesen Fehler bekomme: if (d - route.traveldate.start_date)% route.traveldate.interval == 0: TypeError: nicht unterstützte Operandentyp (en) für -: 'unicode' und ' datetime.date – Florian

+0

Sie sollten mit timedelta berechnen, ob die Route Ihre gewünschte ist, also die Einheit des Intervalls was ist? – Ykh

+0

siehe Antwort Update – Ykh