Django filter events occurring today

前端 未结 6 701
伪装坚强ぢ
伪装坚强ぢ 2020-12-09 09:56

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          


        
相关标签:
6条回答
  • 2020-12-09 10:26

    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, )
    
    0 讨论(0)
  • 2020-12-09 10:29

    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 )
    
    0 讨论(0)
  • 2020-12-09 10:34

    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))
    
    0 讨论(0)
  • 2020-12-09 10:44

    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
    
    0 讨论(0)
  • 2020-12-09 10:45

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

    0 讨论(0)
  • 2020-12-09 10:45

    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.

    0 讨论(0)
提交回复
热议问题