Domanda

Quale sarebbe l'equivalente di App Engine di questa affermazione Django?

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

Non ho finito per scrivere questo:

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

Ma è piuttosto orribile rispetto a Django. Qualsiasi altro modo più Pythonic / Django-magic, per esempio con gli attributi Post.filter() o created_at.day/month/year?

È stato utile?

Soluzione

Non è necessario 'relativedelta' - ciò che si descrive è un datetime.timedelta. In caso contrario, la risposta sembra buono.

Per quanto riguarda il tempo di elaborazione va, la cosa bella di App Engine è che quasi tutte le domande hanno lo stesso risultato costo per - e tutti loro scala proporzionalmente ai record restituiti, non la dimensione totale datastore. Come tale, la soluzione funziona bene.

In alternativa, se avete bisogno del vostro filtro di disuguaglianza per qualcos'altro, si potrebbe aggiungere un 'created_day' DateProperty, e fare un semplice controllo di uguaglianza su questo.

Altri suggerimenti

Come su

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

finito per usare la libreria relativedelta + concatenamento i filtri in stile jQuery, che pur troppo non ancora Pythonic, è un po 'più confortevole per scrivere e molto asciugatrice. :) Ancora non è sicuro se è il modo migliore per farlo, in quanto probabilmente richiedono più tempo di elaborazione del database?

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 slug alla vista object_detail o ancora un altro filtro.

Tra l'altro è possibile utilizzare il datetime.timedelta. Che permette di trovare gli intervalli di date o la data delta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top