Ofek Agmon
Ofek Agmon

Reputation: 5198

DRF - filter list by DateField

I have a Ride model:

class Ride(models.Model):
    driver = models.ForeignKey('auth.User', related_name='rides_as_driver')
    destination=models.ForeignKey(Destination, related_name='rides_as_final_destination')
    leaving_time=models.TimeField()
    leaving_date=models.DateField(default=datetime.date.today)
    num_of_spots=models.IntegerField()
    passengers=models.ManyToManyField('auth.User', related_name="rides_as_passenger")
    mid_destinations=models.ManyToManyField(Destination, related_name='rides_as_middle_destination')

and I am trying to filter the rides_as_driver field by today's date:

def get(self, request):
        user=self.request.user
        driverRides = user.rides_as_driver.filter(leaving_time=datetime.date.today)

The filter line throws an exception, saying:

RemovedInDjango19Warning: Passing callable arguments to queryset is deprecated.
  value, lookups, used_joins = self.prepare_lookup_value(value, lookups, can_reuse, allow_joins)

I also tried with get: driverRides = user.rides_as_driver.get(leaving_time=datetime.date.today), didn't work.

How do I filter a list of objects by field value?

Thanks!

Upvotes: 0

Views: 328

Answers (1)

Ivan
Ivan

Reputation: 6013

First, leaving_time is a TimeField which stores datetime.time values, while you are trying to filter by a datetime.datetime object. You have leaving_date in your code which you should apparently filter by instead.

Second, the error says that you are passing a function (datetime.date.today) as a filter argument and this is dropped in Django 1.9.

So what you want to do is:

driverRides = user.rides_as_driver.get(leaving_date=datetime.datetime.now().date())

Also check out documentation on Time zones if you have to handle users from multiple time zones in your application.

Upvotes: 1

Related Questions