Save ManyToMany with through intermediary class
django, django-models, django-views
Solution
The solution for save a ManyToMany relation with a intermediary class (through):
def add_setor(request):
form = SetorForm(request.POST or None)
if form.is_valid():
setor = Setor.objects.create(nome=form.cleaned_data['nome'])
for promotor_id in request.POST.getlist('promotores'):
m1 = Membro(promotor_id=promotor_id, setor=setor)
m1.save()
messages.add_message(request, messages.SUCCESS, 'Setor cadastrado com sucesso!')
return HttpResponseRedirect('/project/setor/index/')
return render_to_response('project/setor/form.html', locals(), context_instance=RequestContext(request))
I have not use the form directly, but extract the setor name of the form then create the object setor. Create the Membro object with the id's promotores in the form and the object setor, the last action is the save Membro object. Regards.
Problem
I read many links to this problem: How to save a django model with a manyToMany Through relationship, AND regular manyToMany relationships How to save a django model with a manyToMany Through relationship, AND regular manyToMany relationships django manytomany through Include the DOC: https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships But can't save my M2M with through intermediary class. My models: ``` class Promotor(PessoaFisica): user = models.OneToOneField(User, blank=True, null=True) class Setor(models.Model): nome = models.CharField(max_length=255) promotores = models.ManyToManyField(Promotor, through='Membro', blank=True, null=True) class Meta: verbose_name_plural = 'setores' def __unicode__(self): return "%s" % (self.nome) class Membro(models.Model): promotor = models.ForeignKey(Promotor) setor = models.ForeignKey(Setor) data_inclusao = models.DateField(auto_now=True) ``` The save method: ``` def add_setor(request): form = SetorForm(request.POST or None) if form.is_valid(): s = form.save() setor = get_object_or_404(Setor, pk = s.id) for promotor_id in request.POST.getlist('promotores'): membro = Membro.objects.create(promotor_id=promotor_id, setor_id=setor.id) membro.save() messages.add_message(request, messages.SUCCESS, 'Setor cadastrado com sucesso!') return HttpResponseRedirect('/project/setor/index/') return render_to_response('project/setor/form.html', locals(), context_instance=RequestContext(request)) ``` The error is: ``` Cannot set values on a ManyToManyField which specifies an intermediary model. Use setor.Membro's Manager instead. ``` If the save() method have commit "false", the "setor" does not have the "id" to put in Membro object. How to save setor with this through intermediary class? Thanks!