Django的分配M2M我工作在Django项目保存

Django的分配M2M我工作在Django项目保存

问题描述:

后,我有以下问题:Django的分配M2M我工作在Django项目保存

我有这两个类,团队和项目。当我创建一个项目时,我想自动为团队中的用户分配在创建项目时选择的项目到新项目。 我重写了项目的保存方法,并在创建项目后将用户分配给该项目(我在保存之后做了,因为在给出错误之前)。我尝试了几种方法,但都没有成功。 试图:

self.user.add(*self.team.users.all()) 
self.save() 

而这是行不通的。

尝试迭代:

for uTeam in self.team.users.all(): 
    self.users.add(uTeam) 

和也不管用。

,对我的工作的唯一方法是这样的,但只有在Django的外壳:

P = Project.objects.get(pk=1) 
T = Team.objects.get(pk=1) 
P.user.add(*T.user.all()) 
P.save() 

这是下面我有,但Django不工作的解决方案(提供了一个无限循环)

class Team(models.Model): 
    name = models.CharField(max_length=200, 
          help_text=_('name of the team')) 
    user = models.ManyToManyField(settings.AUTH_USER_MODEL, 
           related_name="members_of_team", 
           help_text=_('users of the team'), 
           null=True 
           ) 
    and more.... 


class Project(models.Model): 
    id = models.AutoField(primary_key=True, null=False) 
    name = models.CharField(max_length=200, 
          help_text=_('name of project'), 
          ) 
    team = models.ForeignKey(Team,`enter code here` 
          on_delete=models.PROTECT, 
          help_text=_('team of project')) 
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, 
            on_delete=models.PROTECT, 
            related_name='creator_project', 
            blank=True, 
            null=False, 
            help_text=_('project created by')) 
    customer = models.ForeignKey(Customer, 
           on_delete=models.PROTECT, 
           help_text=_('customer')) 
    user = models.ManyToManyField(settings.AUTH_USER_MODEL, 
            related_name='users_team', 
            blank=True, 
            null=False, 
            help_text=_('users of this project')) 


    def save(self, *args, **kwargs): 

    if self.checkIntegrity(): 
     super(Project, self).save(*args, **kwargs) 
     if self.user.all().count() < self.team.user.all().count(): 
     T = Team.objects.get(pk=self.team.id) 
     P = Project.objects.get(pk=self.id) 
     P.user.add(*T.user.all()) 
     P.save() 

谢谢您的帮助

+0

只是为了说明 - 在保存项目本身引发异常之前将用户添加到项目中,因为项目还没有主键,因此您不能将用户分配到(在那个时刻)不存在的项目。接下来 - afaik在迭代中添加用户(第二次尝试)并将它们添加为列表(您在'save()'中的当前代码)不应该有任何区别。你有没有一些调试信息,如果它真的循环通过那个循环? – yedpodtrzitko 2013-03-27 14:22:03

+0

发生了什么是P.save()调用保存项目和检查完整性,超级调用(项目,自我),再次分配T和P,并添加用户另一个时间... 我注意到,分配,但进入无限循环,一段时间后得到一个“RuntimeError:最大递归深度超过” – Charlisim 2013-03-27 15:34:01

+0

是的,这是有道理的。但是调用'P.save()'(最后一行不是必须的,对吧? – yedpodtrzitko 2013-03-27 22:47:54

我得到了它,我读了M2M字段保存()和post_save(后填写),并有触​​发时,M2M领域的变化,所以我WR信号ite如下:

@receiver(m2m_changed, sender=Project.user.through) 
def m2mChange(sender, **kwargs): 
    instance = kwargs['instance'] 
    T = Team.objects.get(pk=instance.team.id) 
    if kwargs['pk_set'] is None: 
     instance.user.add(*T.user.all()) 

现在它工作正常。 谢谢大家。