使用ManyToMany关系保存对象

时间:2009-01-09 12:14:59

标签: django django-models many-to-many

我有模型(简化示例):

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。如何处理这种情况?我在尝试将人员添加到任务之前尝试保存,然后再次保存,但这不起作用。

至于
CHRISS

2 个答案:

答案 0 :(得分: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是否为null来确定“基本组”的内容,例如会计和销售与“会计团队3”。但是,大多数情况下,你并没有在两个地方复制“人员名单”。

答案 1 :(得分:0)

这是example,不涉及覆盖保存。它看起来比你正在做的更简单。