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()
谢谢您的帮助
答
我得到了它,我读了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())
现在它工作正常。 谢谢大家。
只是为了说明 - 在保存项目本身引发异常之前将用户添加到项目中,因为项目还没有主键,因此您不能将用户分配到(在那个时刻)不存在的项目。接下来 - afaik在迭代中添加用户(第二次尝试)并将它们添加为列表(您在'save()'中的当前代码)不应该有任何区别。你有没有一些调试信息,如果它真的循环通过那个循环? – yedpodtrzitko 2013-03-27 14:22:03
发生了什么是P.save()调用保存项目和检查完整性,超级调用(项目,自我),再次分配T和P,并添加用户另一个时间... 我注意到,分配,但进入无限循环,一段时间后得到一个“RuntimeError:最大递归深度超过” – Charlisim 2013-03-27 15:34:01
是的,这是有道理的。但是调用'P.save()'(最后一行不是必须的,对吧? – yedpodtrzitko 2013-03-27 22:47:54