带模型的Django组逻辑(manytomany-relationship)

时间:2015-01-17 23:05:26

标签: python django logic m2m

我有一个关于如何使用Django实现某些组逻辑的问题,所以这里有一张图片来帮助理解我的目标:

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

编辑: http://i.stack.imgur.com/h8SEW.png

所以我想要的是:

  • 有一个主要组(Group1),当成员加入子组Group2和3时 - 他将自动添加到Group1
  • Group2和Group3中都可以有成员 - 但它们在Group1中不应该存在两次。

如果可以实现,我还想拥有以下功能:

  • 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.
  • 最后但并非最不重要的是,我认为通过save-function实现事物的方式效果不会很好 - 特别是当每个组中有大量成员时...

0 个答案:

没有答案