django Невозможно установить значения для ManyToManyField, в котором указана промежуточная модель. Используйте менеджер вместо
Я работаю над сохранением в одной и той же форме двух таблиц - с отношением 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')
где я не прав?
3 ответа
Как видно на:
http://docs.djangoproject.com/en/dev/topics/db/models/
В отличие от обычных полей "многие ко многим", вы не можете использовать добавление, создание или присваивание (например, 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.
Как указано в 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/ говорится, что:
"Вы также можете использовать add(), create() или set() для создания отношений, если вы укажете through_defaults для любых обязательных полей"
Поэтому просто обновите django до версии 2.2 или более новой, чтобы использовать вышеуказанные методы, и при создании объектов укажите аргумент through_defaults в виде словаря Python с ключами в качестве дополнительных имен полей и значениями в качестве значений по умолчанию.