django无法在指定中间模型的ManyToManyField上设置值.请改用管理器

dan*_*ana 19 forms django m2m

我正在努力保存相同的表格两个表 - 有一个m2m的关系.我没有成功,我的错误仍然存​​在于以下内容:无法在指定中间模型的ManyToManyField上设置值.使用会员经理而不是会员资格是我的'直通表'.

我的代码:

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))  
Run Code Online (Sandbox Code Playgroud)

我的模特:

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')
Run Code Online (Sandbox Code Playgroud)

我哪里错了?

Tho*_*esk 36

如果您被允许修改class Membership,添加auto_created = True可能会解决您的问题,

class Membership(models.Model): 
    class Meta:
        auto_created = True
Run Code Online (Sandbox Code Playgroud)

在Django 1.7中,错误消息更改为"无法在ManyToManyField上设置指定中间模型的值".解决方案是一样的.

注意:这将完全删除您的中间模型,以及所有其他字段.

  • Django确实在使用auto_created时删除了中间模型.此外,它没有记录 - 所以使用它可能不明智. (3认同)
  • 这对我有用,但是在重置数据库后,发生一个奇怪的错误:关系“ app_membership”不存在 (2认同)

Kla*_*ven 18

如上所示:

http://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany

与普通的多对多字段不同,您不能使用添加,创建或分配(即,beatles.members = [...])来创建关系

我猜你的代码在"form.save_m2m()"行上跳了起来,这是不必要的,因为你已经手动创建了成员资格.

  • 你怎么能保存到通过表?我有一个类似的问题,其中save()不起作用. (3认同)
  • 我正在使用Django 1.8并且在差不多2天之后没有任何作用.我已按照文档中提到的所有步骤进行操作(https://docs.djangoproject.com/en/1.8/topics/db/models/#intermediary-manytomany).但没有任何作用,所以最后我决定从源模型(即你的案例中的Classroom)中删除M2M关系,然后创建一个中间模型.现在它工作正常,我能够保存和检索相关数据. (2认同)