如何从Google App Engine数据存储区查询中订购引用的对象?

时间:2009-03-27 19:40:03

标签: python google-app-engine google-cloud-datastore

我有Exhibit个引用Gallery个对象的对象,这两个对象都存储在Google App Engine数据存储区中。

当我绕过迭代值(最终在Django模板中)时,如何在每个Exhibit对象上订购Gallery集合?

即。这不起作用


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

在模板中渲染时,画廊的排序是正确的,但展品不是。

1 个答案:

答案 0 :(得分:4)

您需要构建自己的查询,而不是依赖App Engine创建的集合属性:

  

exhibit = Exhibit.all()。filter(“gallery =”,gallery).order(“position”)

或等效地,在GQL中:

  

展示= db.GqlQuery(“SELECT * FROM Exhibit WHERE gallery =:1 ORDER BY position”,gallery)

如果您希望能够从模板内部执行此操作,而不是传入展览列表列表,则可以在Gallery对象上定义一个执行此查询的简单方法,并从模板(例如,{{gallery.exhibits_by_position}}将在Gallery对象上执行exhibit_by_position(),然后可以执行上面的查询。

如果您担心速度影响,请不要担心:App Engine创建的集合属性只是语法糖。