我正在使用谷歌应用引擎,并且无法编写查询来过滤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)
以及其他各种不起作用的东西。希望有人可以给我一个正确的方向......
答案 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。