intermediate - manytomanyfield django through
django No se pueden establecer valores en un ManyToManyField que especifica un modelo intermediario. Usa el Administrador en su lugar (4)
A partir de la versión Django 2.2 , también puede especificar un through_defaults
en el campo para usar agregar, crear y asignar:
Los
RelatedManager.add()
,create()
,remove()
,set()
,get_or_create()
yupdate_or_create()
ahora están permitidos en relaciones de muchos a muchos con modelos intermedios. El nuevo argumentothrough_defaults
se usa para especificar valores para las nuevas instancias del modelo intermedio.
En su caso, dado que todos los campos ya tienen valores predeterminados, podría funcionar en 2.2.
Estoy trabajando para guardar en la misma forma dos tablas: tener una relación de m2m. No tengo éxito, mi error persiste con algo como: No se pueden establecer valores en un campo ManyToManyField que especifica un modelo intermediario. Utilice el Administrador de membresía en lugar de donde la Membresía es mi ''a través de la tabla''.
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'')
donde me equivoco
Como se ve en:
http://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany
A diferencia de los campos normales de muchos a muchos, no puede usar agregar, crear o asignar (es decir, beatles.members = [...]) para crear relaciones
Supongo que su código se dispara en la línea "form.save_m2m ()", lo cual no es necesario ya que usted ya crea manualmente una membresía.
Si se le permite modificar class Membership
, agregar 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 pueden establecer valores en un campo ManyToManyField que especifica un modelo intermediario". La solución es la misma.
NOTA: Esto eliminará completamente su modelo intermedio y todos los campos adicionales con él.
Tuve un mensaje de error similar en un problema diferente. Lo publico aquí por si acaso ayuda a otros.
He agregado un nuevo ManyToManyField
en un modelo existente. Este modelo se usó en un ModelForm
construido con un campo de exclude
.
Arreglo el problema agregando el nuevo campo en los excluidos.