Выберите между двумя датами с Django

116

Я хочу сделать запрос, который выбирает даты с помощью Django.

Я знаю, как это легко сделать с помощью необработанного SQL, но как этого добиться с помощью Django ORM?

Вот где я хочу добавить в свой запрос промежуток времени 30 дней:

start_date = datetime.datetime.now() + datetime.timedelta(-30)
context[self.varname] = self.model._default_manager.filter(
    current_issue__isnull=True
    ).live().order_by('-created_at')
Джефф Таггарти
источник

Ответы:

230

Используйте __rangeоператор:

...filter(current_issue__isnull=True, created_at__range=(start_date, end_date))
Дэниел Розман
источник
Является ли created_at произвольным полем в модели или это фактический журнал базы данных, когда была создана запись?
Bigbob556677 02
@ Philip556677 Это произвольное поле в модели. Вы можете установить для параметра DateField auto_now_add значение True, чтобы это было легко.
Benbb96
1

два метода

.filter(created_at__range=[from_date, to_date])

другой метод

.filter(Q(created_at__gte=from_date)&Q(created_at__lte=to_date))
  • gte означает больше, чем равно
  • lte означает меньше, чем равно
Манджуант В.М.
источник
Q Объекты не нужны во втором методе, вы можете написать:.filter(created_at__gte=from_date, created_at__lte=to_date)
CarMoreno
0

Если вы используете DateTimeField, Фильтрация по датам не будет включать элементы за последний день.

Вам нужно указать значение как дату:

...filter(created_at__date__range=(start_date, end_date))
suhailvs
источник