Вот как бы я это сделал. Создайте отдельную группу для каждой задачи и при необходимости инициализируйте каждую группу другой:
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()
Теперь вы можете повторно использовать свои подгруппы, плюс вы можете определить, что такое «базовые группы», такие как «Учет и продажи» и «Бухгалтерская группа 3», проверив, является ли parent_group нулевым. Однако в большинстве случаев вы не дублируете «список людей» в двух местах.