Escolha entre duas datas com Django

116

Estou procurando fazer uma consulta que seleciona entre datas com Django.

Eu sei como fazer isso com SQL bruto com bastante facilidade, mas como isso poderia ser feito usando o Django ORM?

É aqui que desejo adicionar as datas entre 30 dias na minha consulta:

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')
Jeff Taggarty
fonte

Respostas:

230

Use o __rangeoperador:

...filter(current_issue__isnull=True, created_at__range=(start_date, end_date))
Daniel Roseman
fonte
O "created_at" é um campo arbitrário em um modelo ou este é o registro real do banco de dados de quando o registro foi criado?
Bigbob556677
@ Philip556677 É um campo arbitrário em um modelo. Você pode definir o parâmetro auto_now_add do DateField como True para ter isso facilmente.
Benbb96
21

__range

Ignacio Vazquez-Abrams
fonte
1

dois métodos

.filter(created_at__range=[from_date, to_date])

outro método

.filter(Q(created_at__gte=from_date)&Q(created_at__lte=to_date))
  • gte significa maior que igual
  • lte significa menos do que igual
Manjuanth VM
fonte
Objetos Q são desnecessários no segundo método, você pode escrever:.filter(created_at__gte=from_date, created_at__lte=to_date)
CarMoreno
0

Se você estiver usando um DateTimeField , a filtragem com datas não incluirá itens do último dia.

Você precisa converter o valor como data:

...filter(created_at__date__range=(start_date, end_date))
Suhailvs
fonte