模型与html模板的关系

时间:2010-12-12 04:18:45

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

我一直在努力解决这个问题几个小时 - 我知道可能有一个简单的解决方案,我忽视了。

我和我的模特有一对多的关系。

我需要返回一个对象的所有行以及相关对象的行。

从某种意义上说,我有这个:

 object 
 object
   object_relationship.property
   object_relationship.property
object
   object_relationship.property
object

现在 - 我可以完成所有这些,但是当我想将它们发送回html模板时,我遇到了一个问题。

我可以将对象发回 - 但是如何按照我上面的顺序发送object_relationship?

这有意义吗?

2 个答案:

答案 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来分析您的应用。