Django не удается обработать поле формы ManyToMany в представлении для создания и сохранения нового экземпляра модели

У меня есть две модели с отношением ManyToMany. В моем представлении я хочу обработать пользовательский ввод поля MultipleChoicesField и присвоить выбранные варианты объекту Poller.

Вызывает следующую ошибку:

Прямое назначение на прямую сторону множества "многие-ко-многим" запрещено. запрещено. Вместо этого используйте poller_categories.set().

.

Models.py

class Categories(models.Model):
    poller_category = models.CharField(max_length=30)
    poller_category_id = models.IntegerField(default=0)

    def __str__(self):
        return str(self.poller_category)


class Pollers(models.Model):

    [..]

    # Poller Category
    poller_categories = models.ManyToManyField(Categories)

    def __str__(self):
        return str(self.poller_id)

Forms.py

class PollersForm(forms.Form):

    [..]

    # Poller Tags
    poller_categories = forms.ModelMultipleChoiceField(queryset=Categories.objects.all())

views.py

def raise_poller(request):
        # if this is a POST request we need to process the form data
        if request.method == 'POST':

            # create a form instance and populate it with data from the request:
            form = PollersForm(request.POST)

            # check whether it's valid:
            if form.is_valid():
                # process the data in form.cleaned_data as required

                poller_nature = form.cleaned_data['poller_nature']
                poller_text = form.cleaned_data['poller_text']
                poller_choice_one = form.cleaned_data['poller_choice_one']
                poller_choice_two = form.cleaned_data['poller_choice_two']
                poller_categories = form.cleaned_data['poller_categories']

                # Get the user
                created_by = request.user

                # Save the poller to the database
                p = Pollers(poller_nature = poller_nature,
                            poller_text = poller_text,
                            poller_choice_one = poller_choice_one,
                            poller_choice_two = poller_choice_two,
                            poller_categories = poller_categories,    # here seems to be my issue?
                            created_by = created_by)
                p.save()

                # redirect to a new URL:
                return HttpResponseRedirect('/')

Вы не можете напрямую присвоить значение объекту poller_categies. Вы должны сначала сохранить объект Pollers в базе данных, а затем использовать p.poller_categories.set(…) для заполнения отношения многие-ко-многим: отношение

p = Pollers(
    poller_nature = poller_nature,
    poller_text = poller_text,
    poller_choice_one = poller_choice_one,
    poller_choice_two = poller_choice_two,
    # no poller_categories,
    created_by = created_by
)
p.save()
p.poller_categories.set(poller_categories)

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

Вернуться на верх