【问题标题】:Subtraction of two dates in django query在 django 查询中减去两个日期
【发布时间】:2011-03-07 08:02:31
【问题描述】:
class Case( models.Model ):
created          = models.DateTimeField()    
modified          = models.DateTimeField()

STATUS = (
    ('Active', 'Active'),
    ('Hold', 'Hold'),
    ('Expired', 'Expired'),
    ('Cancelled', 'Cancelled'),
)
status     = models.CharField(max_length=32, choices=STATUS)

现在我想提取记录,状态过期不到 2 个月前,不应该计算超过 2 个月前过期。

我已阅读 __here subtraction of dates,但在我的情况下它不起作用。

 expired_cases = Case.objects.filter( status = 'Expired', modified__lt = datetime.now() - timedelta(days=60) ).count()  

这种查询可能有效,但我不想硬编码其中的日子。

请帮助我解决这个问题。 提前谢谢:)

【问题讨论】:

  • 我不完全确定问题是什么。你有Case.objects.filter(...的电话,你试过了吗?它奏效了吗? ...您当然不必对天数进行硬编码...您可以将其放入 Django 设置文件中,将其作为参数传递给视图等。
  • 以上查询有效,但我不想硬编码两个月的 60 天,因为我不知道前两个月是 30 天,可能一个是 30,另一个是 28 ,或 31。所以我想要这样的查询,它独立于硬编码的日子。
  • 好吧,我已经回答了你的问题,但我意识到固定天数,比如 60 天,仍然比计算前几个月的天数要好。如果我在中间,比如 3 月 8 日(今天),两个月前到底是什么时候?你没有计算 2 月和 1 月的日子。

标签: django model date subtraction


【解决方案1】:

您可以使用 python 的日历库返回日期列表。请注意,它不处理闰年,因此您需要为此实施解决方案。

>>> days = calendar.mdays
[0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

以这种方式获取当月的天数,然后计算您需要的时间增量。您需要从列表中删除第一个元素才能使其正常工作。

>>> days = days[1:]
>>> month = datetime.date.today().month-1 #-1 due to 0-based indexing in list
>>> delta = days[month-1] + days[month-2]

【讨论】:

    【解决方案2】:

    使用 python-dateutil 模块。从修改后的时间中创建一个 Python 日期时间对象并减去。它应该可以工作。

    【讨论】:

    • <field>__lt 在 Django 中意味着过滤字段中小于参数的值。 modified__lt 应该不是问题。
    • modified__lt 表示修改的值小于赋值不是问题。
    • 哦,我不知道这个:-/抱歉打扰了
    猜你喜欢
    • 2020-10-06
    • 2011-02-21
    • 2012-06-07
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多