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

时间:2010-06-22 08:09:55

标签: django forms 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))  

我的模特:

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')

我哪里错了?

5 个答案:

答案 0 :(得分:36)

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

class Membership(models.Model): 
    class Meta:
        auto_created = True

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

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

答案 1 :(得分:18)

如上所示:

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

  

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

我猜您的代码会在“form.save_m2m()”行上跳闸,这是不必要的,因为您已经手动创建了成员资格。

答案 2 :(得分:4)

我在另一个问题上有类似的错误消息。我在这里发布它,以防它帮助别人。

我在现有模型上添加了新的ManyToManyField。此模型用于ModelForm内置exclude字段。

我通过在排除的字段中添加新字段来解决问题。

答案 3 :(得分:0)

Django 2.2 release开始,您还可以在字段上指定through_defaults以便使用添加,创建和分配:

  

RelatedManager.add()create()remove()set()get_or_create(),   和update_or_create()方法现在允许多对多   与中间模型的关系。新的through_defaults   参数用于指定新的中间模型的值   实例。

在您的情况下,由于所有字段都已经具有默认值,因此它可能仅适用于2.2。

答案 4 :(得分:0)

根据https://docs.djangoproject.com/en/2.1/topics/db/models/

中的说明

“与普通的多对多字段不同,您不能使用add(),create()或set()创建关系”

这意味着对于Django 2.1版,这些方法是不可能的。但是django 2.2文档https://docs.djangoproject.com/en/2.2/topics/db/models/的同一页显示:

“只要您为任何必填字段指定through_defaults,您也可以使用add(),create()或set()创建关系”

因此只需将django更新为2.2或更高版本以使用上述方法,并在创建对象的同时将参数'through_defaults'作为python字典,并以键作为额外的字段名称,并将值作为默认值。