Django-Rest-Framework POST-запрос c многоуровневым json, как прописать представление?
у меня есть следующие модели и представления: мои модели:
class Modules(models.Model):
module_name = models.CharField(max_length=50)
module_duaration = models.IntegerField()
class_room = models.IntegerField()
def __str__(self):
return self.module_name
class Students(models.Model):
name = models.CharField(max_length=50)
age = models.IntegerField()
grade = models.IntegerField()
modules = models.ManyToManyField(Modules)
def __str__(self):
return self.name
Мои представления:
class StudentsViewSet(viewsets.ModelViewSet):
serializer_class = StudentsSerializer
def get_queryset(self):
student = Students.objects.all()
return student
def create(self, request, *args, **kwargs):
data = request.data
new_student = Students.objects.create(
name=data["name"], age=data['age'], grade=data["grade"])
new_student.save()
for module in data["modules"]:
module_obj = Modules.objects.create(module_name=module["module_name"],
module_duaration=module["module_duaration"],
class_room=module["class_room"])
new_student.modules.add(module_obj)
serializer = StudentsSerializer(new_student)
return Response(serializer.data)
Это позволяет мне через post отправлять такие данные:
{
"name": "gb",
"age": 11,
"grade": 22,
"modules": [
{
"module_name": "erer",
"module_duaration": 1,
"class_room": 1
},
{
"module_name": "rer",
"module_duaration": 2,
"class_room": 2
}, ...
]
}
Данное решение работает корректно, но теперь мне необходимо добавить еще один уровень в json чтобы получилось следующее:
{
"vadim": "test1",
"stud": [
{
"name": "bbbg",
"age": 10,
"grade": 10,
"modules": [
{
"module_name": "erer",
"module_duaration": 1,
"class_room": 1
},
{
"module_name": "rer",
"module_duaration": 2,
"class_room": 2
}
]
}
]
}
Если предположим, что мои модели выглядят следующим образом:
class Modules(models.Model):
module_name = models.CharField(max_length=50)
module_duaration = models.IntegerField()
class_room = models.IntegerField()
def __str__(self):
return self.module_name
class Students(models.Model):
name = models.CharField(max_length=50)
age = models.IntegerField()
grade = models.IntegerField()
modules = models.ManyToManyField(Modules)
def __str__(self):
return self.name
class Vadim(models.Model):
vadim = models.CharField(max_length=50)
stud = models.ForeignKey(Students, on_delete=models.CASCADE)
То как будет выглядеть мой views? Пробовал прописать разные варианты, постоянно упираюсь в ошибки
Один из неудачных вариантов:
class VadimViewSet(viewsets.ModelViewSet):
serializer_class = VadimSerializer
def get_queryset(self):
vadim = Vadim.objects.all()
return vadim
def create(self, request, *args, **kwargs):
data = request.data
new_vadim = Vadim.objects.create(
vadim=data["vadim"])
new_vadim.save()
for student in data["stud"]:
student_obj = Students.objects.create(name=student["name"],
age=student["age"], grade=student["grade"],
modules=student["modules"])
for module in student_obj["modules"]:
module_obj = Modules.objects.create(module_name=module["module_name"],
module_duaration=module["module_duaration"],
class_room=module["class_room"]
)
new_vadim.modules.add(student_obj, module_obj)
serializer = VadimSerializer(new_vadim)
return Response(serializer.data)
В данном случае получаю следующие ошибки:
Traceback (most recent call last):
File "C:\Users\root\PycharmProjects\Project1\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\Users\root\PycharmProjects\Project1\venv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\root\PycharmProjects\Project1\venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "C:\Users\root\PycharmProjects\Project1\venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\root\PycharmProjects\Project1\venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
response = self.handle_exception(exc)
File "C:\Users\root\PycharmProjects\Project1\venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "C:\Users\root\PycharmProjects\Project1\venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
raise exc
File "C:\Users\root\PycharmProjects\Project1\venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
response = handler(request, *args, **kwargs)
File "C:\Users\root\PycharmProjects\Project1\spacefarm\database\views.py", line 130, in create
student_obj = Students.objects.create(name=student["name"],
File "C:\Users\root\PycharmProjects\Project1\venv\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Users\root\PycharmProjects\Project1\venv\lib\site-packages\django\db\models\query.py", line 455, in create
obj = self.model(**kwargs)
File "C:\Users\root\PycharmProjects\Project1\venv\lib\site-packages\django\db\models\base.py", line 502, in __init__
_setattr(self, prop, kwargs[prop])
File "C:\Users\root\PycharmProjects\Project1\venv\lib\site-packages\django\db\models\fields\related_descriptors.py", line 545, in __set__
raise TypeError(
TypeError: Direct assignment to the forward side of a many-to-many set is prohibited. Use modules.set() instead.
[08/Apr/2022 11:36:30] "POST /vadim/ HTTP/1.1" 500 108480