友谊模式:如何找到友谊是否存在?

时间:2012-11-20 20:26:15

标签: python-2.7 google-app-engine model

我有以下型号

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')

我可以创造朋友和友谊。 但是如何检查友谊是否存在? 是否有更好的方式来塑造友谊?

2 个答案:

答案 0 :(得分: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'

最后一个选项是最有效的,假设您的排序并不复杂,但您需要担心边缘情况(例如,两个名为John Smith的用户)。散列名称加上其他一些属性(例如用户注册时),然后进行比较,会降低但不会阻止这种可能性。

答案 1 :(得分: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()