0

我有模型(简化示例):

class Group(models.Model):
  name = models.CharField(max_length = 32)

class Person(models.Model):
  group = models.ForeignKey(Group)

class Task(models.Model):
  group = models.ForeignKey(Group)
  people = models.ManyToManyField(Person)

  def save(self, **kwargs):
    ppl = Person.objects.all().filter(group = self.group)
    for p in ppl:
      self.people.add(p)
    super(Task, self).save(**kwargs)

我想将任务分配给某些人,并添加属于该组的所有人员,以及稍后添加其他人(或从任务中删除特定人员)。显然不会执行保存,因为对象在要添加多对多关系对象时没有id。如何处理这种情况?我尝试在将人员添加到任务之前保存,然后再次保存,但没有奏效。

问候
克里斯

4

2 回答 2

1

这就是我的做法。为每个任务创建一个单独的组,并可选择用另一个组初始化每个组:

class Person(models.Model):
    name = models.CharField(max_length=64)

class Group(models.Model):
    name = models.CharField(max_length=32)
    people = models.ManyToManyField(Person)
    parent_group = models.ForeignKey(Group, null=True, blank=True)

    def save(self, **kwargs):
        # copy parent's people in to this group if this is a new instance and parent_group is set
        if not self.id and self.parent_group:
            for p in self.parent_group.people:
                self.people.add(p)
        super(Group, self).save(**kwargs)

class Task(models.Model):
    group = models.ForeignKey(Group)

def use_case():
    Group(name='empty group').save()

    group = Group.objects.get(name='Accounting')
    accounting_subgroup = Group(name='Accounting Copy', parent_group=group)
    accounting_subgroup.people.remove(person1)
    accounting_subgroup.people.remove(person2)
    accounting_subgroup.save()

    task = Task(group=accounting_subgroup)
    task.save()

现在您可以重用您的子组,此外,您可以通过检查 parent_group 是否为空来确定“基本组”是什么,例如会计和销售与“会计团队 3”。但是,大多数情况下,您不会在两个地方复制“人员列表”。

于 2009-01-09T23:32:50.983 回答
0

这是一个不涉及覆盖保存的示例。它看起来比你正在做的更简单。

于 2009-01-09T12:18:55.027 回答