我一直在努力解决这个问题几个小时 - 我知道可能有一个简单的解决方案,我忽视了。
我和我的模特有一对多的关系。
我需要返回一个对象的所有行以及相关对象的行。
从某种意义上说,我有这个:
object
object
object_relationship.property
object_relationship.property
object
object_relationship.property
object
现在 - 我可以完成所有这些,但是当我想将它们发送回html模板时,我遇到了一个问题。
我可以将对象发回 - 但是如何按照我上面的顺序发送object_relationship?
这有意义吗?
答案 0 :(得分:2)
你可能不需要太担心这个问题,但是......看看这些模型:
class Venue(base.NamedEntity, HasPerformances, HasUrl, HasLocation):
city = db.ReferenceProperty(City, collection_name='venues')
url = db.StringProperty(required=True, validator=validators.validate_url)
location = db.GeoPtProperty()
class Performance(base.Entity):
show = db.ReferenceProperty(Show, collection_name='performances', required=True)
utc_date_time = db.DateTimeProperty(required=True)
venue = db.ReferenceProperty(Venue, collection_name='performances', required=True)
在这种情况下,没有什么能阻止您从代码或模板中使用venue.performances
并将其视为列表。 API将根据需要自动触发查询以获取实际对象。 performance.venue
也是如此。
这里唯一的问题是性能 - 你有一个n+1 problem的变种来处理。但是,有一些解决方法,比如Nick Johnson的this article。我建议也阅读API代码......这有助于阅读有关如何捕获和解除引用属性的信息。
答案 1 :(得分:0)
我的第一个建议是,如果您打算做很多类似的报告,那么就会对数据进行非规范化。例如,您可以在object.name
实体上添加object_relationship
。
也就是说,你可以向你的模板发送一个dicts列表,所以可能会这样:
data = []
for entity in your_query:
children = [{'name': child.name} for child in entity.object_relation]
data.append({'name': object.name,
'children': children,
...
})
然后将data
列表传递给您的模板,然后进行处理。
请注意,这将表现得非常糟糕。它将对您的第一个查询中的每个项中的一个项执行另一个查询。使用Appstats来分析您的应用。