Django查询集按ISO周号过滤

Jac*_*Leo 10 python django iso date filter

我有一个包含的模型datefield.我正在尝试获取包含当前周的模型的查询集(从星期一开始).

因为Django datefield包含简单datetime.date模型,我假设使用过滤器.isocalendar().从逻辑上讲,这正是我想要的,没有额外的比较和当前工作日的计算.

所以我想要做的就是强制.filter语句在这个逻辑中表现:

if model.date.isocalendar()[2] == datetime.date.today().isocalendar()[2]
    ...
Run Code Online (Sandbox Code Playgroud)

然而如何在filter语句中编写它? .filter(model__date__isocalendar=datetime.date.today().isocalendar())会给出错误的结果(与今天比较本周不一样).

正如挖掘真实http://docs.python.org/library/datetime.html我没有注意到任何其他工作日选项......

文档说明:

date.isocalendar()返回3元组(ISO年份,ISO周编号,ISO工作日).

更新:

虽然我不喜欢使用范围的解决方案,但它是最好的选择.但是在我的情况下,我创建了一个标记本周开始的变量,只是看起来更大或相等的值,因为如果我正在寻找本周的匹配.如果给出一周的数量它将需要两端.

today = datetime.date.today()
monday = today - datetime.timedelta(days=today.weekday())

... \
.filter(date__gte=monday)
Run Code Online (Sandbox Code Playgroud)

Chr*_*att 8

你无法做到这一点.请记住,这不仅仅是Python支持的问题,Django必须将过滤器传递给数据库,并且数据库不支持这种复杂的日期计算.但是,您可以使用__range开始日期和结束日期.


rad*_*doh 8

比使用ExtractAmit 在他的答案中提到的函数更简单的是使用Django 1.11 中添加的__week字段查找,因此您可以简单地执行以下操作:

.filter(model__date__week=datetime.date.today().isocalendar()[1])
Run Code Online (Sandbox Code Playgroud)

  • 在过去这是不可能的,但现在这应该是公认的答案! (2认同)