Django REST API调用get()返回多个Modules对象报错问题求助
报错原因
你的Modules模型中module_name字段没有设置唯一约束,导致数据库里已经存在多条同名的模块记录,当你用Modules.objects.get(module_name=xxx)查询时,匹配到了2条结果,触发了该报错。
你可以先执行以下ORM语句验证数据库中的重复数据:
from django.db.models import Count Modules.objects.values('module_name').annotate(count=Count('id')).filter(count__gt=1)
执行后会返回所有重复的模块名以及对应的重复条数。
解决方案
1. 修复当前报错
先手动清理数据库中重复的Modules记录,保证每个module_name仅对应一条数据,当前代码即可正常运行。
2. 永久避免重复问题
给Modules模型的module_name字段添加唯一约束,修改后的模型代码如下:
class Modules(models.Model): module_name = models.CharField(max_length=50, unique=True) # 添加unique=True约束 module_duration = models.IntegerField() class_room = models.IntegerField() def __str__(self): return self.module_name
修改完成后执行以下命令同步数据库结构:
python manage.py makemigrations python manage.py migrate
之后数据库会自动阻止插入同名模块,从根源避免该问题。
3. 可选:代码增加容错处理
你也可以修改视图中的查询逻辑,避免偶发重复直接抛出异常,同时支持自动创建不存在的模块:
for module in data["modules"]: # 用filter替代get,避免多结果报错 module_obj = Modules.objects.filter(module_name=module["module_name"]).first() if not module_obj: # 模块不存在时自动创建,注意补全其他必填字段的赋值逻辑 module_obj = Modules.objects.create( module_name=module["module_name"], module_duration=xxx, # 替换为实际默认值或从请求中取 class_room=xxx # 替换为实际默认值或从请求中取 ) new_student.modules.add(module_obj)
内容的提问来源于stack exchange,提问作者Dahn Ng
相关产品推荐
相关产品推荐

