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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top