【问题标题】:Filtering models with ReferenceProperties使用 ReferenceProperties 过滤模型
【发布时间】:2009-01-15 19:28:59
【问题描述】:

我正在使用谷歌应用引擎,并且在编写查询以过滤 ReferenceProperties 时遇到问题。

例如。

class Group(db.Model):
    name = db.StringProperty(required=True)
    creator = db.ReferenceProperty(User)

class GroupMember(db.Model):
    group = db.ReferenceProperty(Group)
    user = db.ReferenceProperty(User)

我尝试过写这样的东西:

members = models.GroupMember.all().filter('group.name =', group_name)

以及其他各种不起作用的东西。希望有人可以在正确的方向上给我一个刺激......

【问题讨论】:

    标签: python google-app-engine


    【解决方案1】:

    如果您的群组是唯一命名的,那么您的“group.name”是群组实体的唯一标识符。

    这意味着你可以写:

      members = models.GroupMember.all().filter(
        "group =",model.Group.gql("WHERE name=:1", group_name).get()
        )
    

    尽管您只需要在堆栈中的某个地方还没有组实体时才需要这样做。

    Google 关于多对多与 appengine 的文章是 here

    【讨论】:

      【解决方案2】:

      如果您想要获取组的成员,ReferenceProperties 具有内置功能。

      class GroupMember(db.Model):
          group = db.ReferenceProperty(Group, collection_name="groupMembers")
          user = db.ReferenceProperty(User, collection_name="groupMembers")
      

      然后你可以写:

      # get the group entity somehow
      group = Group.get(group_key)     
      # do something with the members, such as list the nicknames
      nicknames = [x.user.nickname for x in group.groupMembers]
      

      【讨论】:

        【解决方案3】:

        这需要加入,这在 App Engine 中是不可能的。如果您想按另一个模型的属性进行过滤,则需要将该属性包含在您要查询的模型中。

        【讨论】:

          【解决方案4】:

          这会导致两次数据存储命中,但应该可以工作。如果你使用 memcache 应该没有问题。

          group = models.Group.all().filter("name =", group_name).get()
          members = models.GroupMember.all().filter('group =', group)   
          

          【讨论】:

            【解决方案5】:

            使用您在问题中定义的模型,假设您要列出名为“Space monkeys”的组的所有成员。

            mygroup = Group.gql("WHERE name = :1",'Space monkeys')
            
            for group_member in mygroup.groupmember_set:
                print 'group members name is: %s' % (group_member.user.name)
            

            groupmember_set”被称为“隐式集合属性”,非常有用。您可以通过使用collection_name 关键字参数将默认名称覆盖为ReferenceProperty 来随意调用它。示例见Thomas L Holaday的回答。

            这一切都在 Rafe Kapla 的一篇非常好的论文中得到了解释:Modeling Entity Relationships

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-08-10
              • 1970-01-01
              • 1970-01-01
              • 2014-09-02
              • 2017-03-26
              • 2014-07-25
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多