这会很好,但你需要具体说明你如何定义友谊。考虑以下用户:
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'
最后一个选项是最有效的,假设您的排序并不复杂,但您需要担心边缘情况(例如两个名为 John Smith 的用户)。散列名称加上其他一些属性(例如用户注册时),然后比较它,将减少但不会阻止这种可能性。