2012-11-20 110 views
1

我有以下型號友誼模式:如何找到友誼是否存在?

class User(db.Model): 
    name = db.StringProperty(require=True) 

class Friendship(db.Model): 
    user1 = db.ReferenceProperty(User, collection_name='user1_set') 
    user2 = db.ReferenceProperty(User, collection_name='user2_set') 

我可以創建朋友和友誼。 但如何檢查友誼是否存在? 有沒有更好的方式來塑造友誼?

回答

1

這樣可以正常工作,但您需要具體說明如何定義友誼。考慮以下用戶:

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)。散列名稱加上一些其他屬性(例如用戶註冊時),然後進行比較,會減少但不會阻止這種可能性。

1

充分利用朋友的ListProperty:

class Friendship(db.Model): 
    friends = db.ListProperty(db.Key) # db.Key refers to a user 

那麼它是一個簡單的查詢,找到兩個用戶之間的友誼:

def getFriendship(self, userKey1, userKey2): 
    query = Friendship.gql("WHERE friends = :1 AND friends = :2", userKey1, userKey2) 
    return query.get()