Django не может установить значения на многопоманфилде, которое определяет промежуточную модель. Вместо этого используйте менеджер

StackOverflow https://stackoverflow.com/questions/3091328

  •  29-09-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top