📜  MultipleObjectsReturned: get() 返回了多个问题——它返回了 3 个! - Shell-Bash (1)

📅  最后修改于: 2023-12-03 15:03:03.987000             🧑  作者: Mango

MultipleObjectsReturned: get() 返回了多个问题——它返回了 3 个! - Shell-Bash

当使用 Django ORM 中的 get() 方法时,假如查询结果出现多个值,则会抛出 MultipleObjectsReturned 异常。本文将介绍该异常的原因及解决方法。

异常原因

get() 方法用于查询单个对象,以例子说明:

from myapp.models import MyModel

# 正确的使用方法,必须保证查询结果只有一个
obj = MyModel.objects.get(id=1)

# 错误的使用方法,会抛出 MultipleObjectsReturned 异常
objs = MyModel.objects.get(name="myname")

在上面的例子中,我们对 MyModel 中的 name 字段进行查询,在数据表中存在多个满足条件的记录,这时就会抛出 MuptipleObjectsReturned 异常。

解决方法

既然异常的原因是查询出多个值,那么解决方法也很明确,就是要保证查询条件能够唯一确定一条记录。具体来讲有以下几种方法:

  1. 使用 filter() 方法:将 get() 方法替换成 filter(),并使用 [0] 取出第一个对象,如下所示:
objs = MyModel.objects.filter(name="myname")
if objs:
    obj = objs[0]
  1. 根据实际情况重新设计数据表:如果需要查询的字段并不唯一,可以通过添加其他字段或者调整字段的值来使其唯一。

  2. 使用 try-except 捕获异常:虽然不推荐这种方法,但在某些极端情况下可以使用,这种方法捕获异常后要根据实际情况进行处理。

try:
    obj = MyModel.objects.get(name="myname")
except MyModel.MultipleObjectsReturned:
    # do something

综上所述,MultipleObjectsReturned 异常的产生原因是查询结果出现多个值,解决方法则是要保证查询条件能够唯一确定一条记录。