Как сохранить ManyToManyField для моделирования с помощью метода POST.?(Python 3.6, Django 2.2.) - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть 3 модели, одна из которых - Категория (Fields = category_name), а другая - Подкатегория (Fields = category (ForeignKey to Category), sub_category). И еще одна модель - DummyModel.

# Model
class DummyModel(models.Model):
    name = models.CharField(max_length=20)
    email = models.EmailField()
    category = models.ManyToManyField(Category)
    sub_category = models.ManyToManyField(SubCategory)

Этомоя форма

class StartProjectForm(ModelForm):
    class Meta:
        model = StartProject
        fields = (
            'name',
            'email',
            'category',
            'sub_category',
        )

    def __init__(self, *args, **kwargs):
        super(StartProjectForm, self).__init__(*args, **kwargs)

        self.fields["category"].widget = CheckboxSelectMultiple()
        self.fields["category"].queryset = Category.objects.all()

        self.fields["sub_category"].widget = CheckboxSelectMultiple()
        self.fields["sub_category"].queryset = SubCategory.objects.all()

    def save(self, commit=True):
        clean = self.cleaned_data.get
        name = clean('name')
        email = clean('email')
        category = clean('category')
        sub_category = clean('sub_category')

        obj = StartProject()
        obj.name = name
        obj.email = email
        obj.category = category
        obj.sub_category = sub_category
        obj.save()

Когда я пытаюсь сохранить

Ошибка

Прямое назначение передней стороне множества «многие ко многим» запрещено.Вместо этого используйте category.set ().

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

Если между двумя моделями (например, A и B) имеется отношение many2many, вы должны сохранить оба экземпляра A и B, прежде чем связывать их с помощью метода set ().

Если вы сохраняете толькоA, а не B к базе данных, это означает, что отношение many2many будет в состоянии получить идентификатор экземпляра A, а не B.

Отношение many2many создается промежуточной таблицей между ними,который хранит идентификатор как A, так и B в этом случае.Если у вас есть только 1 идентификатор, вы не можете сделать ссылку.

0 голосов
/ 20 сентября 2019

Вы не можете добавить объект к ManyToManyField при создании экземпляра.Посмотрите на документ.

        obj = StartProject()
        obj.name = name
        obj.email = email
        obj.save()
        obj.category.set(category)
        obj.sub_category.set(sub_category)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...