Como posso encomendar objetos referenciados de uma consulta Google App Engine Datastore?
-
22-08-2019 - |
Pergunta
Eu tenho objetos Exhibit
que Gallery
referência a objetos os quais são armazenados no Google App Engine Datastore.
Como posso encomendar a coleção Exhibit
em cada objeto Gallery
quando eu dar a volta a iteração sobre os valores (em última análise, em um modelo de Django)?
i. Isso não funciona
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
Quando prestados no modelo, as galerias estão corretamente ordenados mas as exposições não são.
Solução
Em vez de confiar na propriedade coleção App Engine cria, você precisa construir sua própria consulta:
= exposições Exhibit.all (). Filtro ( "galeria =", galeria) .order ( "posição")
ou equivalentemente, em GQL:
exposições = db.GqlQuery ( "SELECT * FROM Exhibit ONDE galeria =: 1 ORDER BY posição", galeria)
Se você quer ser capaz de fazer isso de dentro do modelo, ao invés de passar em uma lista de-listas de exposições, você pode definir um método simples sobre o objeto Gallery que executa esta consulta, e referenciá-lo a partir do template (por exemplo, {{gallery.exhibits_by_position}} irá executar exhibits_by_position () no objeto Gallery, que pode, em seguida, executar a consulta acima).
Se você está preocupado com as implicações de velocidade deste, não se preocupe:. A propriedade de coleção App Engine cria é o açúcar simplesmente sintática para este