Django で対称的な友情システムを実装する方法を 2 つ見つけました(あなたは私の友達なので、私もあなたの友達です)。
ドキュメント内で提案されているように:
class UserProfile(models.Model):
friends = models.ManyToManyField(User, related_name='friends')
今、私はすべての「フレンドリーな」ユーザーおよびユーザープロファイルモデルを1つのselect_related-queryで取得したいと思います(逆結合ルックアップである必要があります):
profiles = UserProfile.objects.filter(user__in=request.user.get_profile().friends.all()).select_related()
これにより、select_related() を使用でき、すべての関連オブジェクトがキャッシュされます。
一方、次のように、friends フィールドを「self」に参照するモデルを定義できます。
class UserProfile(models.Model):
friends = models.ManyToManyField('self')
今、私の select_related 友人ルックアップは次のようになります:
profiles = this_user.get_profile().friends.all().select_related()
ユーザー オブジェクトとそれに関連するプロファイルの両方が常に必要です。2 番目のアプローチは、select_related() による逆ルックアップに関してははるかに簡単ですが、実質的には同じです。ただし、フィールド参照として「self」を使用することで、Django は対称的な友情を処理してくれます。したがって、データベースに友情ごとに 2 つのエントリを手動で作成する必要はありません。Django は私のためにそれを行います。ただし、対称オプションは「自己」参照フィールドでのみ機能します。
より良い解決策はどれですか? 私はそれについて何も見つけることができません。どんなアイデアでも大歓迎です - ありがとう!