1

Djangoでプロジェクトに取り組んでいますが、次の問題があります。

チームとプロジェクトの2つのクラスがあります。1つのプロジェクトを作成するときに、プロジェクトの作成時に選択したものをチームのユーザーに自動的に新しいプロジェクトに割り当てたいと思います。Projectのsaveメソッドをオーバーライドし、プロジェクトが作成された後、ユーザーをプロジェクトに割り当てます(保存した後、エラーが発生する前に行ったため)。私はいくつかの方法を試しましたが、どれもうまくいきません。試してみました:

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()

ご協力ありがとうございました

4

1 に答える 1

0

私はそれを理解しました。save()とpost_save()の後にm2mフィールドが入力され、m2mフィールドが変更されたときにトリガーされるシグナルがあるので、次のように記述します。

@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())

そして今、それはうまく機能します。すべてをありがとう。

于 2013-03-28T10:46:42.423 に答える