django ne peut pas définir des valeurs sur une ManyToManyField qui spécifie un modèle intermédiaire. Utilisez le Gestionnaire au lieu
Question
Je travaille sur l'épargne sur la même forme deux tables - ayant une relation m2m. Je ne réussis pas, mes d'erreur persiste avec quelque chose comme: ne peut pas définir des valeurs sur une ManyToManyField qui spécifie un modèle intermédiaire. Manager Utiliser à la place des membres où l'adhésion est mon 'par table'.
mon code:
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))
mes modèles:
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')
où je me trompe?
La solution
Comme on le voit sur:
http://docs.djangoproject.com/en / dev / sujets / db / modèles / # intermédiaire-ManyToMany
Contrairement à la normale beaucoup à de nombreux domaines, vous ne pouvez pas utiliser ajouter, créer, ou la cession (à savoir beatles.members = [...]) pour créer des relations
Je suppose que votre code trébuche sur la ligne « form.save_m2m () », ce qui est inutile, puisque vous avez déjà créer manuellement un abonnement.
Autres conseils
Si vous êtes autorisé à modifier class Membership
, ajoutant auto_created = True
pourrait résoudre votre problème,
class Membership(models.Model):
class Meta:
auto_created = True
Dans Django 1.7, le message d'erreur est remplacé par « ne peut pas définir des valeurs sur une ManyToManyField qui spécifie un modèle intermédiaire ». La solution est la même.
NOTE:. Cela supprimera votre modèle intermédiaire entièrement, et tous les autres champs avec elle
J'ai eu un message d'erreur semblable sur un autre problème. Je posterai ici juste au cas où il aide les autres.
J'ai ajouté une nouvelle ManyToManyField
sur un modèle existant. Ce modèle a été utilisé dans un ModelForm
construit avec un champ exclude
.
Je résolu le problème par ajouter le nouveau champ dans les exclus.
du Django version 2.2 vous pouvez également spécifier un through_defaults
sur le terrain afin d'ajouter l'utilisation, la création et l'affectation:
Le
RelatedManager.add()
,create()
,remove()
,set()
,get_or_create()
, et les méthodes deupdate_or_create()
sont désormais autorisés sur un grand nombre à plusieurs relations avec les modèles intermédiaires. Le nouveauthrough_defaults
argument est utilisé pour spécifier des valeurs pour le nouveau modèle intermédiaire instance (s).
Dans votre cas, puisque tous les champs ont déjà par défaut, il pourrait fonctionner en 2.2.