20

我正在努力在同一张表格上保存两个表格 - 具有 m2m 关系。我没有成功,我的错误仍然存​​在,例如:无法在指定中间模型的 ManyToManyField 上设置值。使用 Membership's Manager 代替 Membership 是我的“通过表”。

我的代码:

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

我哪里错了?

4

5 回答 5

37

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

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

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

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

于 2015-01-20T06:07:02.797 回答
20

如上所示:

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

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

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

于 2010-06-22T08:35:20.147 回答
4

我在另一个问题上收到了类似的错误消息。我把它贴在这里以防万一它帮助别人。

ManyToManyField在现有模型上添加了一个新模型。该模型用于ModelFormexclude字段的构建。

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

于 2013-10-08T15:26:43.807 回答
2

Django 2.2 版本开始,您还可以through_defaults在字段上指定 a 以使用 add、create 和 assignment:

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

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

于 2019-04-16T21:21:15.763 回答
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/的同一页告诉我们:

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

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

于 2020-10-06T08:39:25.597 回答