如何在(Python)Google App Engine 数据源上正确执行一对多联接?

2 投票
1 回答
600 浏览
提问于 2025-04-15 12:46

我有一些模型设置成这样:

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上

撰写回答