如何在(Python)Google App Engine 数据源上正确执行一对多联接?
我有一些模型设置成这样:
class Apps(db.Model):
name = db.StringProperty(multiline=False)
description = db.TextProperty()
class AppScreenshots(db.Model):
image_file = db.StringProperty(multiline=False)
description = db.StringProperty(multiline=False)
app = db.ReferenceProperty(Apps)
我想在截图中引用一个“父”应用,像这样:
a = Apps.get(app_key)
ss = AppScreenshots(
image_file = 'foo',
description = 'bar',
app = a
)
ss.put()
但是它给我报错,说:
BadArgumentError('_app should be a string; received ag1raWxsZXItcm9ib3RzcgoLEgRBcHBzGAkM (a Key):',)
我在网上查了一些例子,它们的做法和上面的完全一样。谷歌有一份文档,建议用稍微不同的方式来做,像这样:
a = Apps.get(app_key)
ss = AppScreenshots(
image_file = 'foo',
description = 'bar',
app = a.key()
)
ss.put()
但是这也给我带来了完全一样的错误。
我到底哪里做错了呢?
1 个回答
5
我在尝试运行你的代码时发现了一个问题,似乎你需要把AppScreenshots里的'app'改成别的名字,比如'apps'。在这个情况下,'app'这个词是被保留的。
试试这个查询。你也可以用.filter(),如果你不想要第一个实体的话。
class AppScreenshots(db.Model):
image_file = db.StringProperty()
description = db.StringProperty()
apps = db.ReferenceProperty(Apps)
appsObject = db.Query(Apps).get()
ss = AppScreenshots(image_file = 'foo', description = 'bar',apps = appsObject)
这里有一篇关于建模关系的有用文章,链接。
还有一个相关的问题,在这里的SO上。