首页 > 解决方案 > 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)

标签: python-3.xlistdjango-models

解决方案


首先 -datetime.now().day将为您提供当月的日期(例如18,如果今天是 2020 年 3 月 18 日),但您已经说过您想要今天的日期。以下假设您想要今天的日期,而不是一个月中的哪一天。

(注意:weAreStarDust 指出该字段是 DateTimeField,而不是 DateField,我错过了它并更新了答案)

您现在执行此操作的方式似乎是Rest从数据库中获取所有 s,然后在您的应用程序代码中过滤它们(假设 rests_list comes from something likeRest.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,我会考虑将字段从dateto重命名datetime,或者started_at- 调用字段 date 但有一个 datetime 可能会有点混乱并导致错误。


推荐阅读