Brenden
Brenden

Reputation: 8764

Query datetime by today's date in Django

I'm saving datetime in the db for an object. I'd like to query against the db and select anything from todays date, not datetime.

What's the easiest way to do this? This doesn't work:

invoice_for_today = Invoice.objects.get(user=user, date=date.today())

Upvotes: 52

Views: 87180

Answers (7)

Alexander Truslow
Alexander Truslow

Reputation: 363

There is a new __date field lookup in Django 1.9 you can use:

Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))

Queryset API

Upvotes: 8

Rajan Mandanka
Rajan Mandanka

Reputation: 2053

obj = TeachersPlanner.objects.filter(date__startswith=date.today())

Upvotes: 14

Gal Bracha
Gal Bracha

Reputation: 20011

To get entries from the Last 24 hours you can use:

from datetime import datetime, timedelta

Entry.objects.filter(pub_date__gte = datetime.now() - timedelta(days=1)) 

Upvotes: 9

Marco Silva
Marco Silva

Reputation: 679

in django<1.9

from django.utils.timezone import datetime #important if using timezones
today = datetime.today()
foo_for_today = Foo.objects.filter(datefield__year=today.year, datefield__month=today.month, datefield__day=today.day)

in django>1.9, as they added the date keyword

foo_for_today = Foo.objects.filter(datefield__date=datetime.date.today())

Upvotes: 27

Ismail Badawi
Ismail Badawi

Reputation: 37177

I remember there being plans to add a __date field lookup to make this easier, but as it stands the "standard" way of doing it is

today_min = datetime.datetime.combine(datetime.date.today(), datetime.time.min)
today_max = datetime.datetime.combine(datetime.date.today(), datetime.time.max)
Invoice.objects.get(user=user, date__range=(today_min, today_max))

Upvotes: 68

Peppelorum
Peppelorum

Reputation: 617

You can also do something like this:

today = date.today()
invoice_for_today = Invoice.objects.filter(date__year=today.year, date__month=today.month, date__day=today.day)

Upvotes: 39

jtbandes
jtbandes

Reputation: 118671

Try using the keys date__gte and date__lte. You can pass in two datetime objects marking the boundaries of what you want to match.

Upvotes: 6

Related Questions