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

これは問題なく機能しますが、友情をどのように定義するかについて具体的に説明する必要があります。次のユーザーを検討してください。

a = User(name='a')
a.put()

b = User(name='b')
b.put()

Friendship友情ごとに2つのエントリを作成し、どちらかをクエリして、友情の存在を確認できます。

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関係の存在を確認するたびに、1つのクエリを作成して2つのクエリを実行することもできます。

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という名前の2人のユーザー)について心配する必要があります。名前とその他のプロパティ(ユーザーがサインアップしたときなど)をハッシュしてから比較すると、この可能性は減りますが、防ぐことはできません。

于 2012-11-20T20:49:46.333 に答える
1

友達を ListProperty にします。

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

次に、2 人のユーザー間の友情を見つけるための単純なクエリです。

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 に答える