GQL do App Engine:consultando um intervalo de datas
-
19-09-2019 - |
Pergunta
Qual seria o equivalente do App Engine a esta instrução do Django?
return Post.objects.get(created_at__year=bits[0],
created_at__month=bits[1],
created_at__day=bits[2],
slug__iexact=bits[3])
Acabei escrevendo isso:
Post.gql('WHERE created_at > DATE(:1, :2, :3) AND created_at < DATE(:1, :2, :4) and slug = :5',
int(bit[0]), int(bit[1]), int(bit[2]), int(bit[2]) + 1, bit[3])
Mas é horrível comparado ao Django.Qualquer outra forma mais Pythonic/Django-mágica, por ex.com Post.filter()
ou created_at.day/month/year
atributos?
Solução
Você não precisa de 'relativedelta' - o que você descreve é datetime.timedelta.Caso contrário, sua resposta parece boa.
No que diz respeito ao tempo de processamento, o bom do App Engine é que quase todas as consultas têm o mesmo custo por resultado - e todas elas são dimensionadas proporcionalmente aos registros retornados, não ao tamanho total do armazenamento de dados.Como tal, sua solução funciona bem.
Como alternativa, se você precisar de um filtro de desigualdade para outra coisa, poderá adicionar uma DateProperty 'created_day' e fazer uma verificação simples de igualdade.
Outras dicas
Que tal
from datetime import datetime, timedelta
created_start = datetime(year, month, day)
created_end = created_start + timedelta(days=1)
slug_value = 'my-slug-value'
posts = Post.all()
posts.filter('created_at >=', created_start)
posts.filter('created_at <', created_end)
posts.filter('slug =', slug_value)
# You can iterate over this query set just like a list
for post in posts:
print post.key()
Acabou usando o relativedelta
Biblioteca + encadear os filtros no estilo jQuery, que ainda não muito pitônicos, é um pouco mais confortável de escrever e muito secador. :) Ainda não tenho certeza se é a melhor maneira de fazê -lo, pois provavelmente exigirá mais tempo de processamento de banco de dados?
date = datetime(int(year), int(month), int(day))
... # then
queryset = Post.objects_published()
.filter('created_at >=', date)
.filter('created_at <', date + relativedelta(days=+1))
...
e passando por lesma para o object_detail
Ver ou mais um filtro.
A propósito, você pode usar o DateTime.timedelta. Isso permite encontrar faixas de data ou deltas de data.