Выберите между двумя датами с 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))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.