这样可以正常工作,但您需要具体说明如何定义友谊。考虑以下用户:
a = User(name='a')
a.put()
b = User(name='b')
b.put()
您可以为每个友谊和查询的两个Friendship
条目任何一个来检查友情的存在。
f = Friendship(user1=a, user2=b)
f.put()
f = Friendship(user1=b, user2=a)
f.put()
result = db.GqlQuery("SELECT * FROM Friendship WHERE user1 = :1 AND user2 = :2", a, b).get()
或者,你可以做一个单一的Friendship
和执行两个查询要检查关系的存在,每次:
f = Friendship(user1=a, user2=b)
f.put()
result = db.GqlQuery("SELECT * FROM Friendship WHERE user1 = :1 AND user2 = :2", a, b).get()
if result is None:
result = db.GqlQuery("SELECT * FROM Friendship WHERE user1 = :1 AND user2 = :2", b, a).get()
或者,你可以做一个关于排序规则,将Friendship
定义(如要求较低的字母名称先走):
f = Friendship(user1=a, user2=b) // 'a' is less than 'b'
f.put()
result = db.GqlQuery("SELECT * FROM Friendship WHERE user1 = :1 AND user2 = :2", a, b).get() // 'a' is less than 'b'
最后一个选项是最有效的,假设你的排序ISN复杂的,但你需要担心边缘情况(例如两个用户名为John Smith)。散列名称加上一些其他属性(例如用户注册时),然后进行比较,会减少但不会阻止这种可能性。