5

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

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

4

5 回答 5

5

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

这意味着你可以写:

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

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

Google 关于 appengine 的多对多的文章在这里

于 2009-02-08T20:04:38.940 回答
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]
于 2009-02-11T22:30:31.707 回答
1

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

于 2009-01-15T22:21:23.200 回答
1

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

group = models.Group.all().filter("name =", group_name).get()
members = models.GroupMember.all().filter('group =', group)   
于 2009-01-23T03:35:41.943 回答
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 在一篇非常好的论文中解释了这一切:建模实体关系

于 2010-01-25T18:11:30.317 回答