【问题标题】:GQL with two tables带有两个表的 GQL
【发布时间】:2011-01-01 10:49:33
【问题描述】:

您好,我正在 google appengine 中做一个非常小的应用程序,我使用 python。 我的问题是我有两个使用 de db.model 的表(“clients”和“requests”)。表“client”有email和name字段,表“requests”有email和issue字段。如果两个表中的电子邮件相同,我想做一个查询,为每个请求返回电子邮件、问题和客户名称。有人可以帮忙吗?

【问题讨论】:

    标签: python django google-app-engine gql


    【解决方案1】:

    应用引擎数据存储不支持联接,因此您将无法使用 GQL 解决此问题。您可以使用两种获取方式,一种用于客户端,一种用于请求,也可以使用 ReferenceProperty 来建立两个实体之间的关系。

    如果您需要为一对多关系建模,您可以使用引用属性来完成。对于您的情况,它看起来像这样:

    class Client(db.Model):
        email = db.UserProperty()
        name = db.StringProperty()
    
    class Request(db.Model):
        client = db.ReferencePrpoerty(Client, collection_name='requests')
        issue = db.StringProperty()
    

    任何具有与其关联的 Request 的 Client 实体都会自动获得一个名为 requests 的属性,该属性是一个 Query 对象,它将返回所有具有 client 字段的 Request 实体设置为您正在处理的特定客户实体。

    您可能还需要确保创建请求实体的代码将每个新实体设置为将特定用户的客户端实体作为其祖先。将这些关联项目保留在同一个实体组中可能有助于提高性能和交易。

    【讨论】:

    • 你好。谢谢。客户使用 gmail 电子邮件帐户登录应用程序。一个客户端可以处理多个请求。作为管理员,我希望看到一个列表,其中包含来自所有客户端的所有请求,字段 id 和问题来自表请求和来自表客户端的客户端名称...
    • Google 说:obj1,带有 ref_property 可以有(很多)obj2(也就是被引用的 obj)
    【解决方案2】:

    使用这个模型:

    class Client(db.Model):
        email = db.StringProperty()
        name = db.StringProperty()
    
    class Request(db.Model):
        client = db.ReferenceProperty(Client, collection_name='requests')
        issue = db.StringProperty()    
    

    用这段代码可以查询数据

    from modelos import Client,Request
    
    ctes=Client.all().filter("email =","somemail@mailbox.com.mx")
    
    for ct in ctes:
       allRequest4ThisUser=Request.all().filter("client =",ct)
       for req in allRequest4ThisUser:
         print req.issue
    

    【讨论】:

      猜你喜欢
      • 2017-05-21
      • 2015-09-04
      • 1970-01-01
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-23
      • 2020-10-01
      相关资源
      最近更新 更多