python-3.x - Python。按日期过滤数组的最佳方法
问题描述
我有一个Rest
对象列表。这是 django 模型
class Rest(models.Model):
product = models.ForeignKey('Product', models.DO_NOTHING)
date = models.DateTimeField()
rest = models.FloatField()
我想从中选择对象作为今天的日期。我这样做。也许有一些更方便和紧凑的方式?
for rest in rests_list:
if rest.date.day == datetime.now().day:
result.append(rest)
解决方案
首先 -datetime.now().day
将为您提供当月的日期(例如18
,如果今天是 2020 年 3 月 18 日),但您已经说过您想要今天的日期。以下假设您想要今天的日期,而不是一个月中的哪一天。
(注意:weAreStarDust 指出该字段是 DateTimeField,而不是 DateField,我错过了它并更新了答案)
您现在执行此操作的方式似乎是Rest
从数据库中获取所有 s,然后在您的应用程序代码中过滤它们(假设 rests_list comes from something like
Rest.objects.all()`。通常,您希望进行尽可能多的过滤尽可能在数据库查询本身上,并在客户端代码中尽可能少地过滤。
在这种情况下,您可能想要做的是:
from datetime import date
Rest.objects.filter(date__date=date.today())
这将只带回日期为今天的记录,即您想要的记录。
如果您已经以某种方式拥有了所有其余部分,并且您只想过滤到今天的其余部分,那么您可以使用:
filter(lambda x: x.date.date() == date.today(), rests_list)
这将返回一个过滤器对象,其中仅包含rests_list
具有date
==的项目date.today()
。如果你想要它作为一个列表,而不是一个可迭代的,你可以这样做:
list(filter(lambda x: x.date.date() == date.today(), rests_list))
或者对于一个元组:
tuple(filter(lambda x: x.date.date() == date.today(), rests_list))
注意:如果您实际上只想存储日期,我建议您考虑使用 a DateField
(尽管如果您想存储任何时区信息则不要)。如果您想存储 DateTime,我会考虑将字段从date
to重命名datetime
,或者started_at
- 调用字段 date 但有一个 datetime 可能会有点混乱并导致错误。