如何在当前年份,django中查询当前年份的对象

时间:2015-01-23 01:07:27

标签: python django datetime

我需要找到在

中创建的总对象
1. current year
2. current month
3. last month
4. last year

我在想这个

    this_year = datetime.now().year
    last_year = datetime.now().year -1
    this_month = datetime.now().month
    last month = (datetime.today() - timedelta(days=30)).month

使用

Order.objects.filter(created_at__month=this_month)

问题是

  1. last_month我想要的是不是30天的日历月
  2. 我不确定created_at__month = this_month是否与当前月份或上一年同月匹配
  3. 是否可以在单个查询中获取所有计数

3 个答案:

答案 0 :(得分:16)

today = datetime.datetime.now()

1当前年度

Order.objects.filter(created_at__year=today.year)

2当月

Order.objects.filter(created_at__year=today.year, created_at__month=today.month)

3上个月

last_month = today.month - 1 if today.month>1 else 12
last_month_year = today.year if today.month > last_month else today.year - 1

Order.objects.filter(created_at__year=last_month_year, created_at__month=last_month)

4去年

last_year = today.year - 1
Order.objects.filter(created_at__year=last_year)

5单一查询

由于去年+当前年份包括上个月和当月,并且所有订单> = last_year包括当前年份,查询非常简单:

Order.objects.filter(created_at__year__gte=last_year)

答案 1 :(得分:0)

如果您想在单独的查询中使用它,请执行类似的操作。

from_this_year = Order.objects.filter(created_at__year=this_year)
from_last_year = Order.objects.filter(created_at__year=last_year)
from_june = Order.objects.filter(created_at__month='06',created_at__year=this_year)
from_this_month = Order.objects.filter(created_at__month=this_month,created_at__year=this.year)

注意:在我的例子中,我把' 06'那是六月,但你可以改变它。

答案 2 :(得分:0)

我不认为你能够匹配"月"或者"年"日期字段的一部分,没有一些重要的小提琴或注释。最有可能的是,您最简单的解决方案是定义所需范围的开始和结束,然后对其进行搜索。这可能涉及一些工作。

例如,上个日历月将为:

today = datetime.now()
if today.month == 1:
    last_month_start = datetime.date(today.year-1, 12, 1)
    last_month_end = datetime.date(today.year-1, 12, 31)
else:
    last_month_start = datetime.date(today.year, today.month -1, 1)
    last_month_end = datetime.date(today.year, today.month, 1) - datetime.timedelta(days=1)
Order.objects.filter(created_at__gte=last_month_start, created_at__lte=last_month_end)

GTE和LTE大于或等于"和"小于或等于"。另外值得注意的是,我们使用timedelta来确定本月第一天的前一天是什么,而不是经历上个月是否有28天,29天,30天或31天的所有不同情况。