20

私は同じフォームの2つのテーブルに保存することに取り組んでいます-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')

どこが間違っていますか?

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既存のモデルに新しいものを追加しました。このモデルは、フィールドのあるModelFormビルドで使用されました。exclude

除外されたフィールドに新しいフィールドを追加して問題を修正しました。

于 2013-10-08T15:26:43.807 に答える
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 辞書として指定し、キーを追加のフィールド名として、値をデフォルト値として指定します。

于 2020-10-06T08:39:25.597 に答える