我有模型(简化示例):
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
答案 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,不涉及覆盖保存。它看起来比你正在做的更简单。