1

次のような自己参照型の多対多の関係があります。

class User(models.Model):
    groups = models.ManyToManyField('self', blank=True, null=True)

ユーザー 1 とユーザー 2 の間に関係を作成すると、これは双方向です。私はこれを見ることができます:

User_1_obj.groups.all()
User_2_obj.groups.all()

ただし、次を使用してユーザー 3 をリレーションシップに追加すると:

User_1_obj.groups.add(User_3_obj) 

ユーザー 1 とユーザー 3 は双方向にリンクされています。しかし、ユーザー 2 とユーザー 3 (および関係にある他のすべてのユーザー) もリンクする必要があります。つまり、すべての順列を相互にリンクする必要があります。

User 1 linked to User 2, User 3, User 4
User 2 linked to User 1, User 3, User 4
User 3 linked to User 1, User 2, User 4
User 4 linked to User 1, User 2, User 3

すべてのリンクを反復処理して不足している接続を追加するよりも簡単な方法はありますか?

ありがとう!すべての助けに感謝します。

4

2 に答える 2

0

あなたの目標が、すでに持っているインスタンスを除いて、他のすべてのユーザーを取得することである場合、これはトリックを行います:

class User(models.Model):
    def groups(self):
        return User.objects.exclude(pk=self.pk)

ただし、インスタンスのサブセットのみを検索するUser場合は、 という 2 番目のモデルを作成できますGroup。(基本的に を複製しているので、これは少しひいきに思えdjango.contib.auth.modelsます。)

class Group(models.Model):
    # Some attributes you would like (maybe a name, or code)

class User(models.Model):
    groups = models.ManyToManyField(Group, related_name='users')

    def get_linked_users(self, group):
        return group.users.exclude(pk=self.pk)

あなたが達成しようとしていることはあまりにも漠然と定義されていますが、これらは Django でインスタンス間の関係を表すいくつかの方法です。


ただし、順列をデータベースで表現する必要があるかどうかはわかりません。User含めたいオブジェクトをすべて取得し、後でPython を使用して順列を計算します。

この試みの背後にある理由について、さらに詳しく説明できるかもしれません。もっと簡単な方法があるかもしれません。

于 2012-11-25T17:58:18.183 に答える
0

間違った状況で自己参照関係を使用していると思います。自己参照関係は、ユーザー間の接続の任意の無向グラフを作成しようとしている場合に役立ちます。

ユーザーに接続されているということは、他のすべてのユーザーに自動的に接続されていることを意味し、それらの接続のすべてが意味的に完全に同等である場合、完全な 接続コンポーネントを持つグラフのようなものを定義しようとしているように思えます。この場合、各ユーザーは実際には 1 つのグループにしか所属できません。

スキームでこれを行うこともできますが、ご覧のとおり、完全に接続された状態を強制するために多くの手動管理が必要になり、過度に説明的になります。より良い方向への一歩は、グループ化を null 許容の IntegerField のような単純なフィールドにすることです。

class User(models.Model):
    group = models.IntegerField(null=True)

myUser次に、指定された と同じグループ内のすべてのユーザーをだけで照会できますUser.objects.filter(group=myUser.group)。唯一のトリッキーな部分は、以前は接続されていなかったグループの 2 人のユーザーが接続された場合に、多数のユーザーのグループを一度に再割り当てする必要があることです。ただし、一括更新を実行して、2 番目のグループのすべてのユーザーを最初のグループに再割り当てし、グループをマージすることができます。

ただし、自問する必要がある 1 つの質問は、ユーザーが同じグループ内の他のユーザーから切断すると、そのユーザーがグループ内のすべてのユーザーから切断されることになるかどうかです。

于 2012-11-25T03:48:21.713 に答える