Get() вернул более одного Модуля - он вернул 2! (REST API - Django)
Я застрял в этой проблеме почти на 2 дня. Вот в чем проблема. Мои модели выглядят следующим образом:
class Modules(models.Model):
module_name = models.CharField(max_length=50)
module_duration = 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.get(module_name=module["module_name"])
new_student.modules.add(module_obj)
serializer = StudentsSerializer(new_student)
return Response(serializer.data)
class ModulesViewSet(viewsets.ModelViewSet):
serializer_class = ModudesSerializer
def get_queryset(self):
module = Modules.objects.all()
return module ```
Когда я ПОСТ: { "имя": "steve", "age": 16, "класс": 10, "modules": [ { "имя_модуля": "math" }, { "имя_модуля": "физика" } ] }
В нем говорится:
MultipleObjectsReturned at /app_Five/student/ get() вернул более одного Модуля - он вернул 2!
Я понимаю, что get() получает только один элемент. Но я думаю, что в приведенном выше цикле "for" для каждого цикла существует только одно "имя_модуля". Поэтому каждый раз, когда выполняется get(), он получает только один результат. Может ли кто-нибудь сказать мне, что я сделал не так?
Похоже, вы ожидаете, что имя модуля будет уникальным. Вероятно, у вас в базе данных есть несколько записей Modules
с одинаковым module_name
.
Чтобы обеспечить уникальные имена при создании записей модуля, вы можете изменить модель Modules, чтобы обеспечить это:
class Modules(models.Model):
module_name = models.CharField(unique=True, max_length=50)
module_duration = models.IntegerField()
...