Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用google apps引擎(Python)查询多个表_Python_Google App Engine_Model - Fatal编程技术网

使用google apps引擎(Python)查询多个表

使用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禁用 这里,第一列是

我有三个表格,一个用户,两个软件,三个用户软件

如果假设,具有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中的传统多对多关系一样对此进行建模

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())