Comment puis-je commander des objets référencés à partir d'une requête Google App Engine Datastore?
-
22-08-2019 - |
Question
J'ai des objets Exhibit
qui font référence à des objets Gallery
les deux qui sont stockés dans Google App Engine Datastore.
Comment puis-je commander la collection Exhibit
sur chaque objet Gallery
quand je me déplace à itérer sur les valeurs (en fin de compte dans un modèle Django)?
i.e.. cela ne fonctionne pas
class Gallery(db.Model):
title = db.StringProperty()
position = db.IntegerProperty()
class Exhibit(db.Model):
gallery = db.ReferenceProperty(Gallery, collection_name='exhibits')
title = db.StringProperty()
position = db.IntegerProperty()
galleries = db.GqlQuery('SELECT * FROM Gallery ORDER BY position')
for gallery in galleries:
gallery.exhibits.order('position')
# ... send galleries off the the Django template
Lors du rendu dans le modèle, les galeries sont correctement ordonnées, mais les expositions ne sont pas.
La solution
Au lieu de se fonder sur la propriété de collection App Engine crée, vous devez construire votre propre requête:
expositions = Exhibit.all (). Filtrage ( "galerie =", galerie) .order ( "position")
Ou qui revient, dans GQL:
= db.GqlQuery expositions ( "SELECT * FROM pièce WHERE galerie = 1 ORDER BY position", galerie)
Si vous voulez être en mesure de le faire à l'intérieur du modèle, plutôt que de passer dans une liste-des-listes de pièces à conviction, vous pouvez définir une méthode simple sur l'objet Gallery qui exécute cette requête, et référencer de la modèle (par exemple, {{}} gallery.exhibits_by_position exécutera exhibits_by_position () sur l'objet Gallery, qui peut alors effectuer la requête ci-dessus).
Si vous êtes préoccupé par les conséquences de la vitesse de cela, ne vous inquiétez pas. La propriété collection App Engine crée est tout simplement le sucre syntaxique pour cette