【问题标题】:Django count objects created in current monthDjango 统计当月创建的对象
【发布时间】:2013-12-04 12:41:02
【问题描述】:

我的模型中有字段:

class Order(BaseModel):
    created_at = models.DateTimeField(auto_now_add=True)

我需要计算当月创建的所有订单对象。 在我看来,我该如何做到这一点?

【问题讨论】:

    标签: django django-models django-orm


    【解决方案1】:

    添加.count 操作对我来说效果最好

    import datetime
    
    Order.objects.filter(created_at__gte=datetime.datetime.today().replace(day=1, hour=0, minute=0, second=0, microsecond=0)).count()
    

    【讨论】:

    • objects.objects 是错误的。请务必在 aswers 中使用正确的语法
    • 我在哪里写了 objects.objects ? @MassimoCosta
    • 如果您检查答案的历史记录,您会发现一开始有一个错字已在我的评论后得到修复。作为记录,错字是由@gabriel-innocent-okello 制作(并修复)
    【解决方案2】:

    (当前)接受的答案不正确。如 cmets 所述,也许 OP 想要当年的当前月份。不是任何年份的当前月份。大多数人都想要第一个。

    所以我宁愿这样做

    Order.objects.filter(created_at__gte=timezone.now().replace(day=1, hour=0, minute=0, second=0, microsecond=0))
    

    以上也解决了时区问题。

    【讨论】:

    • timezone.localdate().replace(day=1) 获取时区感知月份。时区可以在from django.utils import timezone中找到
    【解决方案3】:

    一种可能的方式。

    from datetime import datetime
    current_month = datetime.now().month
    
    Order.objects.filter(created_at__month=current_month)
    

    参考https://docs.djangoproject.com/en/stable/ref/models/querysets/#month

    【讨论】:

    • 这也会获取去年同月的记录。例如。 2016 年 4 月; 2015 年 4 月等...如果我们只想要当月的记录,因为 OP 专门要求当月的记录,我们不应该也过年吗?
    【解决方案4】:

    如果您只是在当月之后,这很容易,因为您不必担心结束日期 - 毕竟现在之后什么都无法创建。

    start_of_month = datetime.date.today().replace(day=1)
    orders_this_month = Order.objects.filter(created_at__gte=start_of_month)
    

    【讨论】:

    • 在 Django 1.6 中,start_of_month 出现错误,“method_descriptor”对象没有“today”属性。
    猜你喜欢
    • 2011-04-08
    • 2014-09-12
    • 2021-01-16
    • 2011-02-25
    • 1970-01-01
    • 2020-09-06
    • 2017-02-19
    • 2015-07-26
    • 2012-07-25
    相关资源
    最近更新 更多