2009-01-09 5 views
0

Je modèles (exemple simplifié):objet d'économie par rapport ManyToMany

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) 

Je veux confier la tâche à un groupe de personnes et d'ajouter toutes les personnes qui appartiennent à ce groupe ainsi, comme d'autres personnes plus tard (ou supprimer une personne particulière de la tâche). Évidemment, la sauvegarde ne sera pas effectuée car l'objet n'a pas d'identifiant lorsqu'il veut ajouter des objets de relation many-to-many. Comment gérer une telle situation? J'ai essayé d'économiser juste avant d'ajouter des personnes à la tâche et de sauvegarder à nouveau, mais cela n'a pas fonctionné.

concernant
chriss

Répondre

0

Voici un example qui n'implique pas primordial d'économie. Cela semble plus simple que ce que vous faites.

1

Voici comment je le ferais. Formez un groupe distinct pour chaque tâche, et éventuellement initialiser chaque groupe avec un autre:

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

Maintenant, vous pouvez réutiliser vos sous-groupes, plus vous pouvez déterminer ce que les « groupes de base » sont, comme la comptabilité et les ventes vs " Équipe de comptabilité 3 ", en vérifiant si parent_group est nul. La plupart du temps, cependant, vous ne dupliquez pas une «liste de personnes» à deux endroits.

Questions connexes