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

我可以建立朋友和友谊。但是如何检查友谊是否存在呢?有没有更好的方法来模拟友谊?

4

2 回答 2

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()
于 2012-11-22T11:39:59.320 回答
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 的用户)。散列名称加上其他一些属性(例如用户注册时),然后比较它,将减少但不会阻止这种可能性。

于 2012-11-20T20:49:46.333 回答