我有以下型号
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')
我可以创造朋友和友谊。 但是如何检查友谊是否存在? 是否有更好的方式来塑造友谊?
答案 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()