Quelle est la première GQL pour vérifier un ReferenceProperty?
-
21-09-2019 - |
Question
Je les modèles suivants:
class Author(db.Model):
name = db.StringProperty()
class Story(db.Model):
author = db.ReferenceProperty(Author)
Quelle est la première GQL de trouver toutes les histoires par un auteur. Dans SQL régulière, je vais utiliser les jointures mais je ne pense pas que ce soit disponible dans GQL.
Modifier
Je cherche le chemin de GQL cru, je sais comment faire de la manière Pythonic. Par exemple quelque chose comme (ce qui suit est probablement tout à fait tort):
"SELECT * FROM Story WHERE author = :1", "Shakespeare"
Je veux exécuter ci-dessus à partir des données d'administration GAE> Data Viewer> Interroger le magasin de données. Je veux que le SQL cru que quelqu'un pourrait fonctionner à partir d'un shell mysql ou psql typique.
La solution
Edit2: Ah, la GQL première pour une utilisation dans la visionneuse de données ...
Voici une façon:
1) Exécuter ce et obtenir le numéro d'identification:
SELECT * FROM Author where name = 'shakespeare'
2) En utilisant le numéro d'identification de la requête précédente, exécutez ceci:
SELECT * FROM Story where author = key('Author', 12345)
Edit: enfin, la première GQL:
(Meilleure façon:. Utilisez le nom de la propriété de backreference implicite, sous la forme « modelname_set »)
qry = GqlQuery("SELECT * FROM Author WHERE name = :1", "shakespeare")
shakespeare = qry.get()
shakespeare.story_set # this property now contains all Shakespeare's stories
ou
qry0 = GqlQuery("SELECT * FROM Author WHERE name = :1", "shakespeare")
shakespeare = qry0.get()
qry1 = GqlQuery("SELECT * FROM Story WHERE author = :1", shakespeare.key())
shakespeare_stories = qry1.fetch(10) # probably good to have some limit here
Je préfère cette façon:
qry = Author.all()
qry.filter('name = ', 'shakespeare')
shakespeare = qry.get()
shakespeare.story_set # this property now contains all Shakespeare's stories
La façon plus impliquée peut parfois être nécessaire:
qry0 = Author.all()
qry0.filter('name = ', 'shakespeare')
shakespeare = qry0.get()
qry1 = Story.all()
qry1.filter('author = ', shakespeare.key())
shakespeare_stories = qry1.fetch(10) # probably good to have some limit here