Eu tenho um campo em um modelo como:
class Sample(models.Model):
date = fields.DateField(auto_now=False)
Agora, preciso filtrar os objetos por um período.
Como filtrar todos os objetos que possuem uma data entre 1-Jan-2011
e 31-Jan-2011
?
python
django
django-models
django-queryset
user469652
fonte
fonte
__range
inclui as fronteiras (como sql deBETWEEN
), se você não quer que as fronteiras incluídos você teria que ir com o meu gt / solução lt ...order_by
sobre o geradoQuerySet
pelo mencionado acimafilter
. Eu não uso o Django há anos.Você pode usar django's
filter
comdatetime.date
objetos :fonte
Ao fazer intervalos de django com um filtro, verifique se você sabe a diferença entre usar um objeto de data e um objeto de data e hora. __range é inclusivo nas datas, mas se você usar um objeto datetime para a data final, ele não incluirá as entradas para esse dia se o horário não estiver definido.
retorna todas as entradas da data inicial até a data final, incluindo as entradas nessas datas. Exemplo ruim, pois isso está retornando entradas de uma semana para o futuro, mas você entende.
faltam 24 horas no valor de entradas, dependendo da hora definida para os campos de data.
fonte
date
objeto:>>> from datetime import date
>>> startdate = date.today()
Você pode contornar a "incompatibilidade de impedância" causada pela falta de precisão na
DateTimeField/date
comparação de objetos - que pode ocorrer se o intervalo for usado - usando um datetime.timedelta para adicionar um dia à última data no intervalo. Isso funciona como:Como discutido anteriormente, sem fazer algo assim, os registros são ignorados no último dia.
Editado para evitar o uso de
datetime.combine
- parece mais lógico ficar com instâncias de data ao comparar com aDateTimeField
, em vez de mexer comdatetime
objetos descartáveis (e confusos) . Veja mais explicações nos comentários abaixo.fonte
Example.objects.filter(created__range=[date(2014, 1, 1), date(2014, 2, 1)])
, não incluiria objetos criadosdate(2014, 2, 1)
, como o @cademan explicou útil. Mas se você incrementasse a data de término adicionando um dia, obteria um conjunto de consultas cobrindo os objetos ausentes (e omitindo convenientemente objetos criados pordate(2014, 2, 2)
causa da mesma peculiaridade). A coisa chata aqui é que um intervalo 'manual' especificado comcreated__gte ... created__lte=date(2014, 2, 1)
também não funciona, o que é definitivamente IMHO contra-intuitivo.É simples,
Funciona para mim
fonte
Para torná-lo mais flexível, você pode criar um FilterBackend como abaixo:
fonte
Ainda relevante hoje. Você também pode fazer:
fonte