Djangoは、仲介モデルを指定するManytomanyfieldに値を設定できません。代わりにマネージャーを使用してください

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

  •  29-09-2019
  •  | 
  •  

質問

私は同じフォーム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')

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

役に立ちましたか?

解決

見たように:

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

通常の多くのフィールドとは異なり、ADD、作成、または割り当て(つまり、Beatles.Members = [...])を使用することはできません。

あなたのコードは「form.save_m2m()」という行でトリップすると思います。これは、すでに手動でメンバーシップを作成しているため、不要です。

他のヒント

変更が許可されている場合 class Membership, 、追加 auto_created = True あなたの問題を解決するかもしれません、

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

Django 1.7では、エラーメッセージが変更され、「中間モデルを指定するMonytomanyfieldに値を設定できない」に変更されます。解決策は同じです。

注:これにより、中間モデルが完全に削除され、すべての追加フィールドが削除されます。

別の問題について同様のエラーメッセージがありました。他の人に役立つ場合に備えて、ここに投稿します。

新しいものを追加しました ManyToManyField 既存のモデルで。このモデルはaで使用されました ModelForm で構築されています exclude 分野。

除外されたフィールドに新しいフィールドを追加することにより、問題を修正しました。

のように Django 2.2リリース aを指定することもできます through_defaults ADD、作成、割り当てを使用するためのフィールドで:

RelatedManager.add(), create(), remove(), set(), get_or_create()、 と update_or_create() 現在、中間モデルとの多面的な関係でメソッドが許可されています。新しい through_defaults引数は、新しい中間モデルインスタンスの値を指定するために使用されます。

あなたの場合、すべてのフィールドには既にデフォルトがあるため、2.2で動作する可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top