Estou tentando filtrar uma DateTimeField
comparação com uma data. Quero dizer:
MyObject.objects.filter(datetime_attr=datetime.date(2009,8,22))
Recebo uma lista vazia do conjunto de consultas como resposta porque (acho) não estou pensando em tempo, mas quero "a qualquer momento".
Existe uma maneira fácil no Django para fazer isso?
Eu tenho o tempo no horário definido, não é 00:00
.
Respostas:
Essas pesquisas são implementadas da
django.views.generic.date_based
seguinte maneira:Por ser bem detalhado, existem planos para melhorar a sintaxe usando o
__date
operador. Marque " # 9596 A comparação de um DateTimeField com uma data é muito difícil " para obter mais detalhes.fonte
Q(created__gte=datetime.combine(created_value, time.min))
Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
// editar após comentários
não funciona porque cria um objeto datetime com valores de tempo definidos como 0, portanto, o tempo no banco de dados não corresponde.
fonte
Aqui estão os resultados que obtive com a função timeit do ipython:
contém parece ser mais rápido.
fonte
contains
solução, eu recebo a mensagem de erro:Unable to get repr for <class 'django.db.models.query.QuerySet'>
__contains
filtro. Mas se você estiver com problemas, tente o exemplo do django docs que está usando__gte
.startswith
solução ..Agora o Django possui __date queryyset filter para consultar objetos datetime contra datas na versão de desenvolvimento. Assim, estará disponível em 1.9 em breve.
fonte
o acima é o que eu usei. Não apenas funciona, como também possui algum apoio lógico inerente.
fonte
A partir do Django 1.9, a maneira de fazer isso é usando
__date
um objeto datetime.Por exemplo:
MyObject.objects.filter(datetime_attr__date=datetime.date(2009,8,22))
fonte
Isso produz os mesmos resultados do uso de __ano, __ meses e __ dias e parece funcionar para mim:
fonte
supondo que active_on é um objeto de data, aumente-o em 1 dia e depois alcance
fonte
Aqui está uma técnica interessante - eu alavanquei o procedimento startwith, conforme implementado com o Django no MySQL, para obter o resultado de procurar apenas um datetime até a data. Basicamente, quando o Django faz a pesquisa no banco de dados, ele precisa fazer uma conversão de string para o objeto de armazenamento DATETIME MySQL, para que você possa filtrar isso, deixando de fora a parte do carimbo de data / hora da data - dessa forma% LIKE% corresponde apenas à data objeto e você receberá todos os registros de data e hora para a data especificada.
Isso executará a seguinte consulta:
O BINÁRIO COMO neste caso corresponderá a tudo para a data, independentemente do registro de data e hora. Incluindo valores como:
Espero que isso ajude todos até que o Django saia com uma solução!
fonte
Há um post fantástico no blog que aborda isso aqui: Comparando datas e datas no Django ORM
A melhor solução publicada para Django> 1.7, <1.9 é registrar uma transformação:
Então você pode usá-lo em seus filtros como este:
EDITAR
Esta solução é definitivamente dependente do back-end. Do artigo:
fonte
return '{}::date'.format(lhs), params
Hm .. Minha solução está funcionando:
fonte
fonte
No Django 1.7.6 funciona:
fonte
__lte
por exemplo.Veja o artigo Django Documentation
fonte