2009-01-09 74 views
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) 

我要分配任务给某些群体的人并添加谁属于该组以及所有的人,其他的一些人稍后(或从任务中移除特定人员)。显然,保存将不会执行,因为当它想要添加多对多关系对象时,对象没有标识。如何处理这种情况?在将人们添加到任务然后再次保存之前,我尝试了保存,但那不起作用。

问候
CHRISS

回答

0

这里是一个example不涉及覆盖保存。它看起来比你所做的更简单。

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

现在你可以重用你的小组,再加上你可以决定什么是“碱性基团”是,如会计和销售VS“会计团队3“,通过检查parent_group是否为空。不过,大多数情况下,你并没有在两个地方复制“人员名单”。