使用google apps引擎(Python)查询多个表
我有三个表格,一个用户,两个软件,三个用户软件 如果假设,具有6条用户记录的用户表say U1、U2、…、U6和具有4种不同软件的软件表say S1、S2、S3、S4和UserSoftwares仅在用户请求给定软件时存储引用。 例如:UserSoftwares5记录只有两列SUSERID,即引用其他记录的softwareid。数据如下: U1 S1 U2 S2 U2 S3 U3 S3 U4 S1 现在我期待以下结果:如果当前登录用户是U2: S1禁用 S2使能 S3启用 S4禁用 这里,第一列是softwareid或名称,第二列是status,根据UserSoftwares tablemodel只有两个值可启用/禁用。注意状态不是任何modeltable的字段。 我的逻辑是: 1.通过软件模型中的每个软件进行循环 2.在UserSoftwares模型中查找当前登录用户ID为U2的softwareid: 如果找到,则设置状态=“启用” 如果未找到,则设置状态=“禁用” 3.将此状态属性添加到软件对象。 4.对所有软件重复此步骤。 要获得上述结果,python google app engine中的查询应该是什么?如果您正在寻找连接-GAE中没有连接。顺便说一句,使用两个简单的查询软件和用户软件非常容易,并且可以手动计算所有附加数据。根据,您可以像RDBMS中的传统多对多关系一样对此进行建模使用google apps引擎(Python)查询多个表,python,google-app-engine,model,Python,Google App Engine,Model,我有三个表格,一个用户,两个软件,三个用户软件 如果假设,具有6条用户记录的用户表say U1、U2、…、U6和具有4种不同软件的软件表say S1、S2、S3、S4和UserSoftwares仅在用户请求给定软件时存储引用。 例如:UserSoftwares5记录只有两列SUSERID,即引用其他记录的softwareid。数据如下: U1 S1 U2 S2 U2 S3 U3 S3 U4 S1 现在我期待以下结果:如果当前登录用户是U2: S1禁用 S2使能 S3启用 S4禁用 这里,第一列是
from google.appengine.ext import db
class User(db.Model):
name = db.StringProperty()
class Software(db.Model):
name = db.StringProperty()
class UserSoftware(db.Model):
user = db.ReferenceProperty(User, required=True, collection_name='softwares')
software = db.ReferenceProperty(Software, required=True, collection_name='users')
# use the models like so:
alice = User(name='alice')
alice.put()
s1 = Software(name='s1')
s1.put()
us = UserSoftware(user=alice,software=s1)
us.put()
希望这能有所帮助。由于GAE的数据存储不是关系型的,您必须在不使用联接的情况下对多对多关系进行建模。这里有两种方法,你可以很容易地适应你的需要
使用链接模型方法更新1的工作示例
推荐的链接模型方法
通过以下方式表示每个表,可以对多对多关系建模:
from google.appengine.ext import db
class User(db.Model):
name = db.StringProperty()
class Software(db.Model):
name = db.StringProperty()
description = db.TextProperty()
class UserSoftwares(db.Model):
user = db.ReferenceProperty(User, collection_name='users')
software = db.ReferenceProperty(Software, collection_name='softwares')
正如你所看到的,它与关系人的思维方式非常相似
键列表法替代方案
关系也可以建模为键列表:
此方法更适合于少量键,因为它使用ListProperty,但比上面的链接模型方法更快。谢谢您的回复。但我希望从软件中选择所有软件。现在,如果当前登录用户是“U2”。然后检查每个软件是否分配给用户“U2”,如果从用户软件中找到,则状态为“启用”,否则状态为“禁用”。注意状态字段在任何模型中都不存在。@Nilesh-T您不需要状态字段来获取分配给特定用户的所有软件,但我将根据我给您的模型用一些示例更新我的答案。谢谢您的帮助。这是一个很好的例子。
from google.appengine.ext import db
class User(db.Model):
name = db.StringProperty()
class Software(db.Model):
name = db.StringProperty()
description = db.TextProperty()
class UserSoftwares(db.Model):
user = db.ReferenceProperty(User, collection_name='users')
software = db.ReferenceProperty(Software, collection_name='softwares')
class User(db.Model):
name = db.StringProperty()
softwares = db.ListProperty(db.Key)
class Software(db.Model):
name = db.StringProperty()
description = db.TextProperty()
@property
def users(self):
return User.all().filter('softwares', self.key())