Florian
Florian

Reputation: 35

Django filter query with foreign key

I want to filter query based on three user inputs. Depart City, Arrive City and Date. Depart City and Arrive city are on the same table called Route while the TravelDate is a foreign key in Route. My model

 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)

My View

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 Views how can i make one query that will filter depart_city, arrive_city, and TravelDate of those routes based on user inputed. If a bus is available on that date from city A to city B will be calculated by doing doing something like this if (d - TravelDate.start_date)% TravelDate.interval =0 then display the results to the user.

I cannot get this right. I'm new to Django and trying to learn.

Upvotes: 1

Views: 366

Answers (1)

Ykh
Ykh

Reputation: 7717

Keep interval as IntegerField

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

Upvotes: 1

Related Questions