Django не может установить значения на многопоманфилде, которое определяет промежуточную модель. Вместо этого используйте менеджер
Вопрос
Я работаю над сохранением на той же форме две таблицы - имеющие отношение 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/# indermediary-manytomany.
В отличие от нормальных полей многих к многим, вы не можете использовать Add, создание или назначение (т. Е. Beatles.members = [...]) для создания отношений
Я думаю, что ваши кодовые поездки вверх по линии «form.save_m2m ()», которая не нужна, так как вы уже вручную создаете членство.
Другие советы
Если вам разрешено изменить class Membership
, добавление auto_created = True
может решить вашу проблему,
class Membership(models.Model):
class Meta:
auto_created = True
В Django 1.7 сообщение об ошибке изменяется на «Невозможно установить значения на многопоманфилд, который определяет посредническую модель». Решение такое же.
ПРИМЕЧАНИЕ. Это полностью удалит вашу промежуточную модель и все дополнительные поля с ним.
У меня было аналогичное сообщение об ошибке по другой проблеме. Я публикую это здесь на случай, если это поможет другим.
Я добавил новый ManyToManyField
на существующей модели. Эта модель была использована в ModelForm
построен с An exclude
поле.
Я исправил проблему, добавив новое поле в исключенные.
Как Django 2.2 выпуск Вы также можете указать through_defaults
в поле, чтобы использовать добавление, создание и назначение:
То
RelatedManager.add()
,create()
,remove()
,set()
,get_or_create()
, иupdate_or_create()
Методы теперь разрешены на взаимосвязи с промежуточными моделями. Новыйthrough_defaults
Аргумент используется для указания значений для новых промежуточных экземпляров модели (ы) модели.
В вашем случае, так как все поля уже имеют значения по умолчанию, это может просто работать в 2.2.