2009-03-21 8 views
1

Ce que je veux faire est de construire des mini cms qui contiennent des pages avec un uri.Pourquoi la requête GQL ne correspond pas?

La dernière route de mon URL urls.py pointe vers une fonction dans mon fichier views.py, qui vérifie dans le magasin de données s'il existe une page disponible avec le même uri de la requête en cours et, le cas échéant, affiche la page.

J'ai un modèle:

class Page(db.Model): 
    title = db.StringProperty(required=True) 
    uri = db.TextProperty(required=True) 
    created = db.DateTimeProperty(auto_now_add=True) 
    modified = db.DateTimeProperty(auto_now=True) 
    content = db.TextProperty() 

À mon avis:

def show(request): 
    page = db.GqlQuery('SELECT * FROM Page WHERE uri=:uri', uri=request.path).get() 
    if page is None: 
    return http.HttpResponseNotFound() 
    else: 
    return respond(request, 'pages_show', {'content': request.path}) 

Et j'ai ajouté une entité '/ travail' comme uri au datastore.

Même lorsque request.path est exactement '/ work', la requête ne renvoie pas de correspondance.

Merci pour tous les conseils que vous pouvez me donner!

Et oui, je suis un python noob, App Engine est parfait pour enfin apprendre la langue.

Répondre

4

J'ai trouvé la solution!

Le problème réside dans le modèle.

La banque de données des moteurs d'applications n'indexe pas une propriété TextProperty. Utiliser ce type était erroné depuis le début, donc je l'ai changé en StringProperty, qui est indexé, et donc quel datastore nous permet d'utiliser dans une clause WHERE.

Exemple de modèle de travail:

class Page(db.Model): 
     title = db.StringProperty(required=True) 
     // string property now 
     uri = db.StringProperty(required=True) 
     created = db.DateTimeProperty(auto_now_add=True) 
     modified = db.DateTimeProperty(auto_now=True) 
     content = db.TextProperty() 
+2

Vous n'avez pas vraiment besoin de la propriété uri du tout. Si vous créez des entités Page avec leur nom-clé égal à l'URI, vous pouvez le rechercher avec Page.get_by_key_name (uri), et vous obtenez l'unicité gratuite! –

+0

Ah génial idée Arachnide. Je veux +1 pour votre conseil :-) Merci! –

+0

Merci beaucoup. Je faisais la même chose et je ne comprenais pas pourquoi la requête ne fonctionnait pas. Votre message m'a sauvé de devenir fou. – ibiza

2

Si vous utilisez des arguments de mots-clés nommés ("uri =: uri"), vous devez lier explicitement vos paramètres au mot-clé nommé. Au lieu de:

# incorrect named parameter 
GqlQuery('SELECT * FROM Page WHERE uri=:uri', request.path).get() 

vous voulez

# correct named parameter 
GqlQuery('SELECT * FROM Page WHERE uri=:uri', uri=request.path).get() 

ou vous pouvez simplement utiliser un paramètre de position:

# correct positional parameter 
GqlQuery('SELECT * FROM Page WHERE uri=:1', request.path).get() 
+0

Oui, j'ai fourni un mauvais exemple. Même en utilisant le paramètre nommé ou le paramètre positionnel, j'obtiens toujours le même résultat. Corrigé l'échantillon maintenant, merci! –

Questions connexes