django ne peut pas définir des valeurs sur une ManyToManyField qui spécifie un modèle intermédiaire. Utilisez le Gestionnaire au lieu

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

  •  29-09-2019
  •  | 
  •  

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?

Était-ce utile?

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 de update_or_create() sont désormais autorisés sur un grand nombre à plusieurs   relations avec les modèles intermédiaires. Le nouveau through_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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top