2010-06-22 11 views
14

Estoy trabajando para guardar en el mismo formulario dos tablas - teniendo una relación m2m. No tengo éxito, mi error persiste con algo como: No se pueden establecer valores en ManyToManyField que especifique un modelo intermediario. Use el Administrador de membresía en su lugar donde la membresía es mi 'tabla de acceso'.django No se pueden establecer valores en ManyToManyField que especifique un modelo intermediario. Use Manager en su lugar

mi código:

def save_classroom(request): 
    classroom_instance = Classroom() 
    if request.method == 'POST': 
     form = ClassroomForm(request.POST, request.FILES, user = request.user) 
     if form.is_valid(): 
      new_obj = form.save(commit=False) 
      new_obj.user = request.user 
      new_obj.save() 
      membership = Membership(member = request.user,classroom=new_obj) 
      membership.save() 
      form.save_m2m() 
      return HttpResponseRedirect('.')  
    else: 
      form = ClassroomForm(user = request.user)  
    return render_to_response('classroom/classroom_form.html', { 
      'form': form, 

      }, 
      context_instance=RequestContext(request)) 

mis modelos:

class Classroom(models.Model): 
    user = models.ForeignKey(User, related_name = 'classroom_creator') 
    classname = models.CharField(max_length=140, unique = True) 
    date = models.DateTimeField(auto_now=True) 
    open_class = models.BooleanField(default=True) 
    members = models.ManyToManyField(User,related_name="list of invited members", through = 'Membership') 

class Membership(models.Model): 
     accept = models.BooleanField(default=False) 
     date = models.DateTimeField(auto_now = True) 
     classroom = models.ForeignKey(Classroom, related_name = 'classroom_membership') 
     member = models.ForeignKey(User, related_name = 'user_membership') 

¿Dónde estoy mal?

+0

Sus modelos son ...? –

+0

ahora estoy editando y agregando los modelos. ¡Gracias! – dana

+0

La pregunta relacionada tiene una solución en el nivel ORM: http://stackoverflow.com/questions/22964448/add-for-manytomanyfield-which-specifies-an-intermediary-model – guettli

Respuesta

16

Según lo visto en:

http://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany

diferencia de los campos-muchos-a-muchos normales, no se puede utilizar añadir, crear o asignación (es decir, beatles.members = [... ]) para crear relaciones

Supongo que su código se activa en la línea "form.save_m2m()", lo cual no es necesario porque ya crea una membresía de forma manual.

+0

sí. parece que este fue el problema. gracias! – dana

+3

¿Cómo se puede guardar en una tabla directa? Tengo un problema similar donde guardar() no funciona. – nlr25

+2

Estoy usando Django 1.8 y después de esperar casi 2 días, nada funciona. He seguido todos los pasos mencionados en la documentación (https://docs.djangoproject.com/en/1.8/topics/db/models/#intermediary-manytomany). Pero nada funciona, así que finalmente he decidido eliminar la relación M2M del modelo fuente (es decir, Classroom en su caso) y acaba de crear un modelo intermedio. Ahora funciona bien, puedo guardar y recuperar los datos asociados. –

3

Tuve un mensaje de error similar en un problema diferente. Lo publico aquí por si acaso ayuda a otros.

He añadido un nuevo ManyToManyField en un modelo existente. Este modelo se usó en un ModelForm construido con un campo exclude.

Resolví el problema agregando el nuevo campo en los excluidos.

28

Si se le permite modificar class Membership, añadiendo auto_created = True podría resolver su problema,

class Membership(models.Model): 
    class Meta: 
     auto_created = True 

En Django 1.7, el mensaje de error se cambia a "No se puede establecer valores en una ManyToManyField que especifica un modelo intermediario". La solución es la misma.

NOTA: Esto eliminará por completo su modelo intermedio y todos los campos adicionales con él.

+1

Esto funcionó para mí, pero después de restablecer la base de datos, ocurrió un error extraño: la relación "app_membership" no existe –

+0

Cuando hago un "makemigrations" después de agregar el atributo "auto-created", django quiere eliminar mi propia clase de modelo de intermediario . Por qué ? – Raphael

+1

@Raphael, no me pasó a mí. Puede ser otra pregunta por completo. (Lo siento, mi respuesta podría no ser muy útil, pero al menos te di una respuesta rápida.) –

Cuestiones relacionadas