1

Django でグループ ロジックを実装する方法について質問があるので、私が何を目指しているかを理解するのに役立つ図を次に示します。

http://i.stack.imgur.com/RpKJA.png

編集: http://i.stack.imgur.com/h8SEW.png

だから私が取得しようとしているものは次のとおりです。

  • プライマリ グループ (Group1) があり、メンバーがサブグループ Group2 および 3 に参加すると、自動的に Group1 に追加されます。
  • Group2 と Group3 の両方にメンバーが存在する可能性がありますが、Group1 に 2 度存在することはできません。

達成可能であれば、次の機能も備えたいと考えています。

  • Group4 は再び Group3 のサブグループです。メンバーが Group4 に参加すると、自動的に Group3 のメンバーとして保存されるため、Group1 のメンバーとしても保存されます。

現時点では、次のモデルがあります。

#models.py
class MyGroup(models.Model):

    label = models.CharField(_('Label'), max_length=30)
    members = models.ManyToManyField('MyUser', null=True, blank=True)
    parents = models.ManyToManyField('self', null=True, blank=True, symmetrical=False)
    # parents could be renamed to supersets/masters as well

class MyUser(AbstractBaseUser, PermissionsMixin):
    subscriptions = models.ManyToManyField(
        MyGroup, through=MyGroup.members.through, blank=True
    )

事前に回答いただきありがとうございます-実際に達成できるかどうかを知ることも役立ちます.そうすれば、それを行う方法を考え出すのに何時間も無駄にしないことがわかります.

編集:

私はこのようにしようとしました:

def save(self, *args, **kwargs):
    if self.parents is not None:
        list_of_parents = self.parents.all()
        for x in range(0, len(list_of_parents)):
            new_list_of_users = list(set(list_of_parents[x].members.all()) | set(self.members.all()))
            list_of_parents[x].members = new_list_of_users
            super(MailingList, list_of_parents[x]).save(*args, **kwargs)
    super(MailingList, self).save(*args, **kwargs)

これはある程度機能しますが、非常に不快な欠陥もあります。

  • グループメニューでメンバーを保存すると、ユーザーは親グループにのみ保存されます(これはグループモデルの保存機能であるため)-ユーザーモデルにも別の保存機能を追加できます、しかし、それほど良くはありません
  • ここでの大きな問題は、次のエラーが発生するため、新しいグループを追加できなくなったことです。 "<MyGroup: group5>" needs to have a value for field "from_mygroup" before this many-to-many relationship can be used.
  • 大事なことを言い忘れましたが、保存機能を介して物事を実装する方法は、特に各グループに多数のメンバーがいる場合、うまく機能しないと思います...
4

0 に答える 0