get() 返回了多个模块——它返回了 2 个! (REST API - Django)

Posted

技术标签:

【中文标题】get() 返回了多个模块——它返回了 2 个! (REST API - Django)【英文标题】:get() returned more than one Modules -- it returned 2! (REST API - Django) 【发布时间】:2022-01-11 15:01:31 【问题描述】:

这是我的模型:

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    ```

当我发布这个时:

*
    "name": "steve",
    "age": 16,
    "grade": 10,
    "modules": [
        
            "module_name": "math"
        ,
        
            "module_name": "physics"
        
    ]
*

上面写着:

MultipleObjectsReturned at /app_Five/student/
get() returned more than one Modules -- it returned 2!

我知道get() 只得到一个元素。但我认为在上面的for 循环中,每个循环只存在一个module_name。所以每次get() 执行时,它只能得到一个结果。谁能告诉我我在那里做错了什么?

【问题讨论】:

要检查问题,您可以用 `Modules.objects.filter(module_name=module["module_name"])` 替换该行,然后记录/打印找到的模块。可能在您的数据库中存在多个具有给定名称的实例。 这意味着你的数据库包含多个同名的Module对象。 【参考方案1】:

您似乎希望模块名称是唯一的。您可能在数据库中有多个 Modules 条目具有相同的 module_name

为了在创建模块条目时确保名称唯一,您可以更改模块模型以强制执行此操作:

class Modules(models.Model):
    module_name = models.CharField(unique=True, max_length=50)
    module_duration = models.IntegerField()
...

【讨论】:

以上是关于get() 返回了多个模块——它返回了 2 个! (REST API - Django)的主要内容,如果未能解决你的问题,请参考以下文章

将多个引用游标从 Oracle 过程返回到 Java

Django 动态过滤 ListView 返回错误:get() 为参数“self”获取了多个值

如何从同一个 graphQL 查询返回单个或多个结果?

如何在涉及多个get_terms()的WordPress函数中返回多个值

我应该如何将多个参数传递给 ASP.Net Web API GET?

java如何返回二个变量