44
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
β¦)
20
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))
- [Django]-CSRF verification failed. Request aborted. on django
- [Django]-Django β how do I select a particular column from a model?
- [Django]-How to customize user profile when using django-allauth
8
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
- [Django]-Difference between objects.create() and object.save() in django orm
- [Django]-Django-DB-Migrations: cannot ALTER TABLE because it has pending trigger events
- [Django]-When saving, how can you check if a field has changed?
5
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, )
- [Django]-Django: get last user visit date
- [Django]-Django templates β split string to array
- [Django]-Limiting Memory Use in a *Large* Django QuerySet
2
As it is a DateTimeField
use start_date__date
from django.utils import timezone
today = timezone.now().date()
leave = Event.objects.filter(start_date__date=today)
- [Django]-Django Standalone Script
- [Django]-Django TypeError: get() got multiple values for keyword argument 'invoice_id'
- [Django]-Django database query: How to get object by id?
1
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.
- [Django]-Django select max id
- [Django]-How to reset migrations in Django 1.7
- [Django]-How to access a dictionary element in a Django template?
1
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 )
- [Django]-Django content types β how to get model class of content type to create a instance?
- [Django]-Raw SQL queries in Django views
- [Django]-How can I log both successful and failed login and logout attempts in Django?
1
i have a suggestion
class Car:
name = models.CharField()
launched_date = models.DateTimeField()
it is very difficult to filter datetime field by todays date .
even if you take timezone.now() β you will not get correct output.
becuase timezone.now() has time also.
datetime field has time along with it , so even if you are giving correct date the time will not be matching.
so
it is better to use datefield for filtering based on date
class Car:
name = models.CharField()
launched_date = models.DateField()
answer for the question :-
from django.utils.timezone import datetime
today = datetime.today()
events_for_today = Event.objects.filter(start_date__year=today.year,
start_date__month=today.month,
start_date__day=today.day)
- [Django]-Reference list item by index within Django template?
- [Django]-Django β Create A Zip of Multiple Files and Make It Downloadable
- [Django]-Display django-pandas dataframe in a django template
0
As it is a DateTimeField
use start_date__date
and perform an OR (|)
query
from django.db.models import Q
from django.utils import timezone
today = timezone.now().date()
qs = Event.objects.filter(
Q(start_date__date=today) |
Q(end_date__date=today)
)
- [Django]-TypeError: data.forEach is not a function
- [Django]-IOError: request data read error
- [Django]-In Django, how do I select 100 random records from the database?