0

私はソーシャルクリークオブジェクトを持っています。

各social-clique-objectには、friend-objectのリストがあります。

それぞれの友達オブジェクトには、お互いの友達との関係オブジェクト(会ったときのような楽しい事実がいっぱい)があります。

ここで私は立ち往生しています。モデルを適切に定義して、任意のフレンドオブジェクトにクエリを実行して共有リレーションシップオブジェクトをプルアップできるようにするにはどうすればよいですか?

フレンドオブジェクトのリストが大きく増え続けているため、この回答のような双方向モデルでこれが単純に解決されるとは思いません(リンク先のソリューションでは、friend_aとfriend_bなどの2つの異なるモデルが作成されます)。

私の現在のアプローチは、Relationshipオブジェクトを以下に投稿されているもののようにすることでした。リレーションシップオブジェクトの重複を防ぐために、コードにロジックを追加する必要があります...しかしこれは

 class Relationship(models.Model):
     social_clique = models.ForeignKey( Social_Clique )
     friend_0 = models.ManyToManyField( Friend, related_name='friend_0' )
     friend_1 = models.ManyToManyField( Friend, related_name='friend_1' )

この問題のORMデザインパターンを見つけるためにグーグルに適切なキーワードが欠けていると感じています。この問題の正しい説明またはこれに対処する方法に関する提案はありますか?

4

1 に答える 1

2

friend_xどちらのフィールドもManyToManysであっても意味がありません。友人間の関係はManyToManyですが、Relationshipそれ自体が多対多の関係の中間モデルです(そのため名前が付けられています)。throughしたがって、friend_フィールドはForeignKeysである必要があります。次に、Relationshipをモデルとして使用して、Friendからそれ自体へのManyToManyフィールドを追加で定義します。

class Relationship(models.Model):
    social_clique = models.ForeignKey(Social_Clique)
    friend_0 = models.ForeignKey(Friend, related_name='friend_0')
    friend_1 = models.ForeignKey(Friend, related_name='friend_1')

class Friend(models.Model):
    ... other fields ...
    friends = models.ManyToManyField('Friend', through=Relationship)

meこれで、2人の友人(およびmy_friend)から共有関係に簡単に移動できます。

Relationship.objects.get(friend_0=me, friend_1=my_friend)

また

me.friend_0.filter(friend1=my_friend)

など。そして、あなたはまだ私のすべての友達を得ることができます:

me.friends.all()
于 2012-07-22T20:09:49.493 に答える