2013-03-27 73 views
1

後,我有以下問題: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

回答

0

我得到了它,我讀了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()) 

現在它工作正常。 謝謝大家。