Question

Quel serait le App Engine équivalent de cette déclaration Django?

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

J'ai fini par écrire ceci:

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

Mais il est assez horrible par rapport à Django. Toute autre façon plus magique Django-Pythonic /, par exemple avec des attributs de Post.filter() ou created_at.day/month/year?

Était-ce utile?

La solution

Vous n'avez pas besoin « relativedelta » - ce que vous décrivez est un datetime.timedelta. Dans le cas contraire, votre réponse semble bon.

En ce qui concerne le temps de traitement va, la bonne chose à propos App Engine est que presque toutes les requêtes ont le même coût par résultat - et tous à l'échelle proportionnelle aux dossiers retournés, pas la taille totale de datastore. En tant que tel, votre solution fonctionne très bien.

Alternativement, si vous avez besoin de votre un filtre d'inégalité pour quelque chose d'autre, vous pouvez ajouter un « created_day » DateProperty, et faire une simple vérification d'égalité sur ce point.

Autres conseils

Qu'en est-

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

a fini par utiliser la bibliothèque relativedelta + enchaînant les filtres dans le style jQuery, qui, bien que pas trop Pythonic encore, est un peu plus à l'aise pour écrire et bien sèche. :) Toujours pas sûr si c'est la meilleure façon de le faire, car il va me falloir probablement plus de temps de traitement de base de données?

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

et bouchon de passer à la vue object_detail ou encore un autre filtre.

Par la façon dont vous pouvez utiliser le datetime.timedelta. Cela vous permet de trouver des plages de dates ou deltas date.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top