Comment puis-je commander des objets référencés à partir d'une requête Google App Engine Datastore?

StackOverflow https://stackoverflow.com/questions/691217

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.

Était-ce utile?

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

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