Pregunta

Tengo modelos (ejemplo simplificado):

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)

Quiero asignar la tarea a un grupo de personas y agregar a todas las personas que pertenezcan a ese grupo, así como a otras personas más tarde (o eliminar a una persona en particular de la tarea). Obviamente, guardar no se realizará porque el objeto no tiene identificación cuando quiere agregar objetos de relación de muchos a muchos. ¿Cómo manejar tal situación? Intenté guardar justo antes de agregar personas a la tarea y luego guardar nuevamente, pero eso no funcionó.

saludos
Chris

¿Fue útil?

Solución

Aquí hay un ejemplo que no implica anular el guardado. Parece más simple de lo que estás haciendo.

Otros consejos

Así es como lo haría. Haga un grupo separado para cada tarea y, opcionalmente, inicialice cada grupo con otro:

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

Ahora puede reutilizar sus subgrupos, además de determinar cuáles son los "grupos base". son, como Contabilidad y Ventas vs " Equipo de contabilidad 3 " ;, comprobando si parent_group es nulo. Sin embargo, la mayoría de las veces no estás duplicando una "lista de personas". en dos lugares.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top