Python. Лучший способ отфильтровать массив по дате - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть список 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)

Ответы [ 3 ]

1 голос
/ 18 февраля 2020

Первый - datetime.now().day даст вам день месяца (например, 18, если сегодня 18 марта 2020 года), но вы сказали, что хотите сегодняшнюю дату. Ниже приведено предположение, что вам нужна сегодняшняя дата, а не день месяца.

(ПРИМЕЧАНИЕ: weAreStarDust указал, что это поле DateTimeField, а не DateField, которое я пропустил и обновил ответ для )

То, как вы делаете это сейчас, кажется, что он может извлечь все Rest из базы данных и затем отфильтровать их в коде вашего приложения (при условии, что 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))

ПРИМЕЧАНИЕ. Если вы действительно хотите хранить только дату, Я бы посоветовал рассмотреть возможность использования DateField (хотя нет, если вы хотите хранить любую информацию о часовом поясе). Если вы хотите сохранить DateTime, я бы посоветовал переименовать поле с date на datetime или started_at - вызвать дату поля, но указание даты и времени может быть немного запутанным и привести к ошибкам.

0 голосов
/ 18 февраля 2020

Вы можете использовать фильтр django для фильтрации и получать только данные сегодняшней даты из вашей модели. Нет необходимости сначала извлекать все данные, а затем применять l oop для получения данных о сегодняшней дате. Вы должны написать свой запрос как ...

import datetime
Rest.objects.filter(date__date = datetime.date.today())

Но убедитесь, что часовой пояс должен быть одинаковым для сервера базы данных и веб-сервера

0 голосов
/ 18 февраля 2020

Как Документы говорит

Для полей даты и времени, преобразует значение в качестве даты. Позволяет цепочки дополнительных полевых поисков. Принимает значение даты.

from datetime import datetime
Rest.objects.filter(date__date = datetime.now().day)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...