私は現在、友達機能 (Facebook など) を持つ Web アプリケーションを構築しています。
フレンドがフレンド申請を送信すると、 でフレンドシップ オブジェクトが作成されaccepted = False
ます。リクエストされたフレンドがリクエストを受け入れると、 にaccepted
設定されます。True
これが私のモデルです(大幅に簡略化されています):
class Friendship(models.Model):
sender = models.ForeignKey('Person', related_name='sender')
receiver = models.ForeignKey('Person', related_name='receiver')
accepted = models.BooleanField(default=False)
class Person(models.Model):
person = models.OneToOneField(User)
friends = models.ManyToManyField('self', through=Friendship)
このように持っているので、友達リクエストも管理できます。
ここで、ジョンという人物がいるとしましょう。John のすべての友達を取得したい (たとえば、John の友達リクエストを受け入れたすべての友達と、John が友達リクエストを受け入れたすべての友達)。
これが私が今やっている方法です:
def friends(person):
friends = Friendship.objects.filter(sender=person, accepted=True) | Friendship.objects.filter(receiver=person, accepted=True)
friends = [friendship.sender for friendship in friends if friendship.sender != person] + \
[friendship.receiver for friendship in friends if friendship.receiver != person]
return friends
私には、これは本当に醜く、おそらく遅くて非効率的です。Django には、このようなことを行う方法がありますか?
def friends(person):
return person.friends.filter(accepted=True)
残念ながら、この正確なコードは機能しません。より良い方法はありますか?