これは問題なく機能しますが、友情をどのように定義するかについて具体的に説明する必要があります。次のユーザーを検討してください。
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人のユーザー)について心配する必要があります。名前とその他のプロパティ(ユーザーがサインアップしたときなど)をハッシュしてから比較すると、この可能性は減りますが、防ぐことはできません。