【问题标题】:How to define date range that spans years, months in Django?如何在Django中定义跨越年月的日期范围?
【发布时间】:2011-12-18 22:23:45
【问题描述】:

我有一个包含日期字段的 Django 模型:

class Event(models.Model):
    event_date = models.DateField()

我希望此模型上有一个经理,它只显示在定义为 7 月 1 日(当前年份)至 6 月 31 日(下一年)的时间段内发生的事件。

因此,对于今年,我想返回从 2011 年 7 月 1 日到 2012 年 6 月 31 日的事件。当当前日期为 2012 年 7 月 1 日时,我们将显示发生在 2013 年 6 月 31 日的事件。

我该怎么做呢?

谢谢!

【问题讨论】:

    标签: python django date model filtering


    【解决方案1】:

    直接来自文档:

    start_date = datetime.date(2005, 1, 1)
    end_date = datetime.date(2005, 3, 31)
    Event.objects.filter(event_date__range=(start_date, end_date)
    

    https://docs.djangoproject.com/en/dev/ref/models/querysets/#range

    因此,唯一的挑战是弄清楚当前年份是什么,并调整开始和结束日期以反映这一点。一种经理方法:

    class EventManager(models.Manager):
        def get_query_set(self):
         # Quick check to see what dates we should search within
         return super(EventManager, self).get_query_set().filter(event_date__range=(start_date, end_date))
    
    class Event(models.Model):
        this_year = EventManager()
        ...
    

    现在可以查询了:

    Event.this_year.all()
    

    【讨论】:

    • 是的,就我使用文档而言。但是我该如何动态获取开始和结束日期呢?我宁愿不对这些信息进行硬编码。
    • 如果今天在设定日期之前; start_date 为 (set day, set month, this year - 1) end date is (set day, set month, this year), else start_date is (set day, set month, this year) end date is (set day, set month ,今年 +1)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    相关资源
    最近更新 更多