Django Невозможно установить значения на ManyToManyField, который указывает промежуточную модель. Использовать диспетчер вместо
Я работаю над сохранением в одной и той же форме двух таблиц - с отношением m2m.
Мне не удалось, моя ошибка сохраняется с чем-то вроде: Невозможно установить значения на ManyToManyField, который указывает промежуточную модель. Вместо этого используйте Memberhip Manager
где членство является моей "сквозной таблицей".
мой код:
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')
Где я ошибаюсь?
Ответы
Ответ 1
Как видно на:
http://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany
В отличие от обычных полей "много-ко-многим" вы не можете использовать add, create или assign (т.е. beatles.members = [...]) для создания отношений
Я предполагаю, что ваш код отправляется в строку "form.save_m2m()", что не нужно, поскольку вы уже вручную создали членство.
Ответ 2
Если вам разрешено изменять class Membership
, добавление auto_created = True
может решить вашу проблему,
class Membership(models.Model):
class Meta:
auto_created = True
В Django 1.7 сообщение об ошибке изменяется на "Невозможно установить значения на ManyToManyField, который указывает промежуточную модель". Решение одно и то же.
ПРИМЕЧАНИЕ. Это полностью удалит вашу промежуточную модель и все дополнительные поля с ней.
Ответ 3
У меня было подобное сообщение об ошибке при другой проблеме. Я размещаю его здесь на всякий случай, если это помогает другим.
Я добавил новую ManyToManyField
в существующую модель. Эта модель использовалась в ModelForm
, построенном с полем exclude
.
Я исправил проблему, добавив новое поле в исключенные.
Ответ 4
Начиная с версии Django 2.2, вы также можете указать в through_defaults
значение through_defaults
для использования добавления, создания и назначения:
RelatedManager.add()
, create()
, remove()
, set()
, get_or_create()
и update_or_create()
теперь разрешены в отношениях "многие ко многим" с промежуточными моделями. Новый аргумент through_defaults
используется для указания значений для новых экземпляров промежуточной модели.
В вашем случае, поскольку все поля уже имеют значения по умолчанию, он может просто работать в 2.2.