I\'m struggling to logically represent the following in a Django filter. I have an \'event\' model, and a location model, which can be represented as:
class
timezone.localtime(timezone.now()).date()
gets you the correct date.
To get events occurring today(start
today):
from django.utils import timezone
class EventManager(models.Manager):
def bookings_today(self, location_id):
t = timezone.localtime(timezone.now())
bookings = self.filter(location=location_id, start__year = t.year,
start__month = t.month, start__day = t.day, )
I think exclude is your friend here!
today = datetime.date.today()
tomorrow = today + datetime.timedelta( days = 1 )
self.filter( location = location_id ).exclude( end_date__lt = today ).exclude( start_date__gte = tomorrow )
None of the answers I saw is timezone aware.
Why don't you just do this instead:
from django.utils import timezone
class EventManager(models.Manager):
def bookings_today(self, location_id):
bookings = self.filter(location=location_id, start__gte=timezone.now().replace(hour=0, minute=0, second=0), end__lte=timezone.now().replace(hour=23, minute=59, second=59))
You need to use a range there like this:
class EventManager(models.Manager):
def bookings_today(self, location_id):
from datetime import datetime
now = datetime.now()
bookings = self.filter(location=location_id, start__lte=now, end__gte=now)
return bookings
You'll need two distinct datetime
thresholds - today_start
and today_end
:
from datetime import datetime, timedelta, time
today = datetime.now().date()
tomorrow = today + timedelta(1)
today_start = datetime.combine(today, time())
today_end = datetime.combine(tomorrow, time())
Anything happening today must have started before today_end
and ended after today_start
, so:
class EventManager(models.Manager):
def bookings_today(self, location_id):
# Construction of today_end / today_start as above, omitted for brevity
return self.filter(location=location_id, start__lte=today_end, end__gte=today_start)
(P.S. Having a DateTimeField
(not a DateField
) called foo_date
is irritatingly misleading - consider just start
and end
...)
How about this: pub_date__gte=datetime(2005, 1, 1)
? Use _gte
and __lte
to limit start and end within one day using chaining method.
Maybe something like self.filter(start__gte=datetime(2005, 1, 1)).filter(end__lte=datetime(2005, 1, 1))
. lte
stands for less or equal than, gte
stands for greater or equal than.
I find it in django doc.