這樣可以正常工作,但您需要具體說明如何定義友誼。考慮以下用戶:
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)。散列名稱加上一些其他屬性(例如用戶註冊時),然後進行比較,會減少但不會阻止這種可能性。