Как упорядочить объекты, на которые ссылаются, из запроса к хранилищу данных Google App Engine?
-
22-08-2019 - |
Вопрос
У меня есть Exhibit
объекты, которые ссылаются Gallery
объекты, оба из которых хранятся в хранилище данных Google App Engine.
Как мне заказать Exhibit
сбор по каждому Gallery
объект, когда я перебираю значения (в конечном итоге в шаблоне Django)?
то естьэто не работает
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
При рендеринге в шаблоне галереи упорядочены правильно, а экспонаты — нет.
Решение
Вместо того чтобы полагаться на свойство коллекции, создаваемое App Engine, вам нужно создать собственный запрос:
экспонаты = Exhibit.all().filter("галерея =", галерея).order("позиция")
Или, что то же самое, в GQL:
экспонаты = db.GqlQuery("SELECT * FROM Exhibit WHERE галерея = :1 ORDER BY Position", галерея)
Если вы хотите иметь возможность сделать это изнутри шаблона, а не передавать список списков экспонатов, вы можете определить простой метод объекта Gallery, который выполняет этот запрос, и ссылаться на него из шаблона (например, , {{gallery.exhibits_by_position}} выполнит экспонаты_by_position() для объекта Gallery, который затем сможет выполнить приведенный выше запрос).
Если вас беспокоят последствия этого для скорости, не волнуйтесь:Свойство коллекции, создаваемое App Engine, является для этого просто синтаксическим сахаром.