Создание экземпляра модели, состоящего из поля "многие-ко-многим

Я пытаюсь создать экземпляр модели с помощью post-запроса, однако у меня возникла одна проблема: модель состоит из поля, которое является полем "многие-ко-многим". Сейчас я нахожусь на этапе, когда у меня есть массив, состоящий из первичных ключей экземпляров модели (Модули), которые я хочу связать с моделью, которую я пытаюсь создать (Студент).

Пожалуйста, посмотрите мой код ниже, так как я не знаю, где я ошибаюсь, после некоторых базовых исследований кажется, что мне нужно использовать метод .set().

PUT['modules'] соответствует array, который состоит из значений [1,2,3,5].

def create_student(request):
    """API for creating a student"""
    if request.method == "POST":
        PUT = json.loads(request.body)
        student = Student(name=PUT['name'], join_date=PUT['join_date'], academic_year=PUT['academic_year'],
                          modules=PUT['modules'] # THIS IS WHERE I NEED HELP
                          )
        student.save()
        return JsonResponse(student.to_dict())

    return HttpResponseBadRequest("Invalid method")

Спасибо за ваше время.

Для того чтобы создать отношение ManyToManyField, сначала необходимо сохранить два элемента, которые вы хотите связать. Это необходимо, так как иначе у них не будет первичного ключа: связывание двух элементов осуществляется путем добавления записи в таблицу junction table с двумя первичными ключами для связи.

Если вы хотите связать создаваемую вами Student с модулями, вы сначала создаете student, а затем можете использовать student.modules.add(…) для связи ее с (существующими) модулями, распаковывая список первичных ключей модулей:

def create_student(request):
    """API for creating a student"""
    if request.method == "POST":
        PUT = json.loads(request.body)
        student = Student.objects.create(
            name=PUT['name'], join_date=PUT['join_date'], academic_year=PUT['academic_year']
        )
        student.modules.add(*PUT['modules'])
        return JsonResponse(student.to_dict())
    else:
        # …
Вернуться на верх