Pregunta

¿Cuál sería el equivalente de App Engine de esta declaración Django?

return Post.objects.get(created_at__year=bits[0], 
                            created_at__month=bits[1], 
                            created_at__day=bits[2],
                            slug__iexact=bits[3])

he terminado de escribir esto:

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])

Pero es bastante horrible en comparación con Django. Cualquier otra forma más Pythonic / Django-magia, por ejemplo, con atributos Post.filter() o created_at.day/month/year?

¿Fue útil?

Solución

No es necesario 'relativedelta' - lo que usted describe es una datetime.timedelta. De lo contrario, su respuesta se ve bien.

En lo que va el tiempo de procesamiento, lo bueno de App Engine es que casi todas las consultas tienen el mismo resultado coste por - y todos ellos escalar proporcionalmente a los registros devueltos, no el tamaño total del almacén de datos. Como tal, su solución funciona bien.

Como alternativa, si necesita el filtro de una desigualdad por otra cosa, se podría añadir un 'created_day' DateProperty, y hacer una simple comprobación de igualdad en eso.

Otros consejos

¿Qué 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()

Acabamos yendo en la biblioteca relativedelta + encadenamiento de los filtros en el estilo de jQuery, que si bien no demasiado Pythonic sin embargo, es un poco más cómodo para escribir y mucho más seca. :) Aún no está seguro si es la mejor manera de hacerlo, ya que probablemente va a requerir más tiempo de procesamiento de base de datos?

date = datetime(int(year), int(month), int(day))
... # then
queryset = Post.objects_published()
                            .filter('created_at >=', date)
                            .filter('created_at <', date + relativedelta(days=+1))
                            ...

y pasando babosa a la vista object_detail o aún otro filtro.

Por la forma en que podría utilizar el datetime.timedelta. Que le permite encontrar los intervalos de fechas o deltas de fecha.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top