2010-11-05 3 views
1

J'ai surtout suivi un tutoriel sur comment construire un gustbook en utilisant GAE et Python. Maintenant, je veux seulement montrer les entrées d'un jour particulier, mais la requête GQL ne retourne rien (bien qu'il y ait des entrées de ce jour-là):Pourquoi ma requête GQL ne renvoie aucun résultat dans mon application GAE?

class Shout(db.Model): 
    message= db.StringProperty(required=True) 
    when = db.DateTimeProperty(auto_now_add=True) 
    who = db.StringProperty() 

class MainHandler(webapp.RequestHandler): 
    def get(self): 
     shouts = db.GqlQuery("SELECT * FROM Shout WHERE when=DATE('2010-11-05')") 
     # Return something without the WHERE clause 
     values = {'shouts':shouts} 
     self.response.out.write(template.render('main.html',values)) 

    def post(self): 
     self.response.out.write("posted") 
     shout = Shout(message=self.request.get("message"),who=self.request.get("who")) 
     shout.put() 

Ceci est mon main.html:

<form method="post"> 
    <input type="text" name="who"></input> 
    <input type="text" name="message"></input> 
    <input type="submit" value="Send"> </input> 
</form> 

{% for shout in shouts %} 
    <div>{{shout.message}} from {{shout.who}} on {{shout.when}}</div> 
{% endfor %} 

Répondre

2

Il pourrait y avoir une autre façon de contourner cela, mais je pense que parce que votre propriété est un when Datetime vous serait mieux servi avec quelque chose comme ceci:

shouts = db.GqlQuery("""SELECT * 
          FROM Shout 
         WHERE when >= DATE('2010-11-05') 
          AND when < DATE('2010-11-06')""") 
+2

+1. Vous pouvez également ajouter une propriété DateProperty à votre modèle, puis l'interroger à l'aide d'un filtre d'égalité. Cela prendrait un peu plus de place, mais serait plus facile à interroger (égalité entre deux opérateurs relationnels - d'autant plus important que vous ne pouvez utiliser qu'un opérateur relationnel sur un seul champ). –

+0

Merci d'avoir ajouté cela, David. – bernie

+0

Merci, ça marche maintenant. Est-ce à cause d'un problème de "contournement" que je ne peux pas simplement utiliser '='? – weiqure

1

Essayez ceci:

shouts = db.GqlQuery("SELECT * FROM Shout WHERE when=DATE('2010-11-05')").fetch(5000) 

Bien qu'il soit possible d'utiliser un objet de requête comme itératives, il est une meilleure idée de chercher explicitement les lignes et ne pas dépendre du for dans votre modèle pour faire la travail. Je soupçonne que ce n'est pas soutenu de cette façon. Maintenant que j'y regarde de plus près, je suspecte que le problème est que le champ que vous interrogez est un DateTimeProperty, et en utilisant l'opérateur DATE, vous dites essentiellement que vous voulez 2010-11. -05 00:00:00 et il n'y a pas de dossiers avec cette date et l'heure exacte, alors essayez ceci:

shouts = db.GqlQuery("SELECT * FROM Shout WHERE when >= DATETIME('2010-11-05 00:00:00') and when <= DATETIME('2010-11-05 23:59:59')") 
+0

Même problème que précédemment. Je suppose que l'extraction n'est pas nécessaire car elle n'est pas utilisée dans les exemples d'applications (par exemple http://code.google.com/p/google-app-engine-samples/source/browse/trunk/guestbook/index.html) . – weiqure

+0

Je suis d'accord que c'est une meilleure idée d'aller chercher les lignes explicitement - il est plus efficace de les récupérer toutes en même temps (l'itérateur les récupère en morceaux, ce qui provoque des allers-retours supplémentaires au datastore). Cependant, il n'y a pas de problème avec le fait que le template itère sur l'objet de la requête - cela fonctionne comme si vous l'aviez parcouru en utilisant une boucle for habituelle. –

+2

Je n'essaie pas de donner l'impression d'être accusatoire: je n'aime pas voir des downvotes quand quelqu'un essaie clairement d'être utile. Merci pour votre réponse, Adam. – bernie

Questions connexes