私は同じフォームに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、create、またはassignment(つまり、beatles.members = [...])を使用して関係を作成することはできません。
あなたのコードは「form.save_m2m()」の行でつまずくと思いますが、これはすでに手動でメンバーシップを作成しているので不要です。
class Membership
の変更が許可されている場合は、auto_created = True
を追加すると、問題が解決する可能性があります。
class Membership(models.Model):
class Meta:
auto_created = True
Django 1.7では、エラーメッセージが「中間モデルを指定するManyToManyFieldに値を設定できません」に変更されています。解決策は同じです。
注:これにより、中間モデルとそれに伴うすべての追加フィールドが完全に削除されます。
別の問題についても同様のエラーメッセージが表示されました。他の人に役立つ場合に備えて、ここに投稿します。
既存のモデルに新しいManyToManyField
を追加しました。このモデルは、ModelForm
フィールドで構築されたexclude
で使用されました。
除外されたフィールドに新しいフィールドを追加することで問題を修正しました。
Django 2.2リリース 以降、追加、作成、割り当てを使用するために、フィールドに_through_defaults
_を指定することもできます。
RelatedManager.add()
、create()
、remove()
、set()
、get_or_create()
、およびupdate_or_create()
メソッド現在、中間モデルとの多対多の関係で許可されています。新しい_through_defaults
_引数は、新しい中間モデルインスタンスの値を指定するために使用されます。
あなたの場合、すべてのフィールドにはすでにデフォルトがあるので、2.2でうまくいくかもしれません。