django Невозможно установить значения для ManyToManyField, в котором указана промежуточная модель. Используйте менеджер вместо - PullRequest
18 голосов
/ 22 июня 2010

Я работаю над сохранением в одной форме двух таблиц с отношением 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')

где я не прав?

Ответы [ 4 ]

36 голосов
/ 20 января 2015

Если вам разрешено изменять class Membership, добавление auto_created = True может решить вашу проблему,

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

В Django 1.7 сообщение об ошибке заменено на «Невозможно установить значения для ManyToManyField, в котором указана промежуточная модель». Решение такое же.

ПРИМЕЧАНИЕ. Это полностью удалит вашу промежуточную модель и все дополнительные поля.

18 голосов
/ 22 июня 2010

Как видно на:

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

В отличие от обычных полей «многие ко многим», вы не можете использовать добавление, создание или присваивание (например, beatles.members = [...]) для создания отношений

Я полагаю, ваш код срабатывает в строке "form.save_m2m ()", которая не нужна, поскольку вы уже вручную создаете членство.

4 голосов
/ 08 октября 2013

У меня было похожее сообщение об ошибке по другой проблеме. Я публикую это здесь на всякий случай, если это поможет другим.

Я добавил новый ManyToManyField в существующую модель. Эта модель использовалась в ModelForm, построенном с полем exclude.

Я исправил проблему, добавив новое поле в исключенные.

1 голос
/ 17 апреля 2019

Начиная с версии Django 2.2 , вы также можете указать through_defaults в поле для использования добавления, создания и назначения:

RelatedManager.add(), create(), remove(), set(), get_or_create(), и update_or_create() методы теперь разрешены для многих ко многим отношения с промежуточными моделями. Новый through_defaults Аргумент используется для указания значений для новой промежуточной модели экземпляр (ы).

В вашем случае, поскольку все поля уже имеют значения по умолчанию, он может работать только в 2.2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...