У меня есть поле в одной модели, как:
class Sample(models.Model):
date = fields.DateField(auto_now=False)
Теперь мне нужно отфильтровать объекты по диапазону дат.
Как мне отфильтровать все объекты, у которых есть дата между 1-Jan-2011
и 31-Jan-2011
?
python
django
django-models
django-queryset
user469652
источник
источник
__range
включает в себя границы (например, sqlBETWEEN
), если вы не хотите, чтобы границы были включены, вам придетсяorder_by
что было сгенерированоQuerySet
вышеупомянутымfilter
. Я не использовал Django годами.Вы можете использовать Django
filter
сdatetime.date
объектами :источник
При выполнении диапазонов django с фильтром убедитесь, что вы знаете разницу между использованием объекта date и объекта datetime. __range включает даты, но если вы используете объект datetime для даты окончания, он не будет включать записи для этого дня, если время не установлено.
возвращает все записи от начала до конца, включая записи в эти даты. Плохой пример, так как это возвращает записи через неделю в будущее, но вы получаете дрейф.
будут отсутствовать записи за 24 часа в зависимости от того, какое время для полей даты установлено.
источник
date
объект:>>> from datetime import date
>>> startdate = date.today()
Вы можете обойти «несоответствие импеданса», вызванное отсутствием точности в
DateTimeField/date
сравнении объектов, которое может возникнуть при использовании диапазона, с помощью datetime.timedelta, чтобы добавить день к последней дате в диапазоне. Это работает как:Как уже говорилось ранее, не делая ничего подобного, записи игнорируются в последний день.
Отредактировано, чтобы избежать использования
datetime.combine
- кажется более логичным придерживаться экземпляров даты при сравнении сDateTimeField
, вместо того, чтобы возиться с одноразовыми (и сбивающими с толку)datetime
объектами. Дальнейшее объяснение в комментариях ниже.источник
Example.objects.filter(created__range=[date(2014, 1, 1), date(2014, 2, 1)])
что не будет включать в себя объекты, созданныеdate(2014, 2, 1)
, как объясняет @cademan. Но если вы увеличите конечную дату, добавив один день, вы получите набор запросов, охватывающий эти недостающие объекты (и удобно пропускающие объекты, созданныеdate(2014, 2, 2)
из-за одной и той же причуды). Раздражает то, что «ручной» диапазон, указанный с помощью,created__gte ... created__lte=date(2014, 2, 1)
тоже не работает, что определенно нелогично ИМХО.Просто,
Работает для меня
источник
Чтобы сделать его более гибким, вы можете создать FilterBackend, как показано ниже:
источник
Все еще актуально сегодня. Вы также можете сделать:
источник