Question

J'ai des modèles (exemple simplifié):

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 souhaite attribuer la tâche à un groupe de personnes et ajouter toutes les personnes qui appartiennent à ce groupe, ainsi que d'autres personnes ultérieurement (ou supprimer certaines personnes de la tâche). Évidemment, la sauvegarde ne sera pas effectuée car l'objet ne possède pas d'identifiant lorsqu'il veut ajouter des objets de relation plusieurs à plusieurs. Comment gérer une telle situation? J'ai essayé de sauvegarder avant d'ajouter des personnes à une tâche, puis de sauvegarder à nouveau, mais cela n'a pas fonctionné.

salutations
chriss

Était-ce utile?

La solution

Voici un exemple qui n'implique pas l'annulation de la sauvegarde. Cela semble plus simple que ce que vous faites.

Autres conseils

Voici comment je le ferais. Créez un groupe distinct pour chaque tâche et initialisez-le éventuellement 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()

Vous pouvez maintenant réutiliser vos sous-groupes et définir le type de "groupes de base". sont, par exemple, Comptabilité et Ventes contre "Comptabilité 3", en vérifiant si parent_group est null. Cependant, la plupart du temps, vous ne dupliquez pas une "liste de personnes". à deux endroits.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top