Django no podrá ajustar los valores en un ManyToManyField que especifica un modelo intermediario. Utilice el Administrador vez

StackOverflow https://stackoverflow.com/questions/3091328

  •  29-09-2019
  •  | 
  •  

Pregunta

Estoy trabajando en el ahorro de la misma forma dos mesas - tener una relación M2M. No lo consigo, mi error persiste, con algo como: No se puede establecer valores en una ManyToManyField que especifica un modelo intermediario. Gestor de uso en lugar de miembro donde la membresía es mi 'a través de la mesa'.

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?

¿Fue útil?

Solución

Como se ve en:

http://docs.djangoproject.com/en / dev / temas / db / modelos / # intermediario-muchosamuchos

  

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

Creo que el código hace tropezar en la línea "form.save_m2m ()", que es innecesaria puesto que ya crear manualmente una membresía.

Otros consejos

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 "los valores no se puede establecer en un ManyToManyField que especifica un modelo intermediario". La solución es el mismo.

NOTA:. Esto eliminará el modelo intermedio en su totalidad, y todos los campos adicionales con ella

Yo tenía un mensaje de error similar en un problema diferente. He puesto aquí en caso de que ayuda a los demás.

¡Tengo una nueva ManyToManyField en un modelo existente. Este modelo fue utilizado en un ModelForm construido con un campo exclude.

Me solucionó el problema de añadir el nuevo campo de los excluidos.

A partir de la Django 2.2 liberación también puede especificar un through_defaults en el campo con el fin de utilizar complemento, crear y asignación:

  

El RelatedManager.add(), create(), remove(), set(), get_or_create(),   y los métodos update_or_create() ahora se permite en muchos-a-muchos   relaciones con los modelos intermedios. El nuevo through_defaults   argumento se utiliza para especificar los valores para el nuevo modelo intermedio   instancia (s).

En su caso ya que todos los campos ya tienen valores por defecto que podría funcionar en el punto 2.2.

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