2012-11-20 69 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()