使用ReferenceProperties过滤模型

时间:2009-01-15 19:28:59

标签: python google-app-engine

我正在使用谷歌应用引擎,并且无法编写查询来过滤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)

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

5 个答案:

答案 0 :(得分:5)

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

这意味着你可以写:

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

虽然你只需要这样做,但如果你还没有将某个组实体放在堆栈的某个地方。

谷歌的关于多对多与appengine的文章是here

答案 1 :(得分:4)

如果你想要的是获得一个组的成员,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]

答案 2 :(得分:1)

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

答案 3 :(得分:1)

这会导致两个数据存储点击但应该有效。如果你使用memcache不应该是一个问题。

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

答案 4 :(得分:0)

使用您在问题中定义的模型,假设您要列出名为“ 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