会出现EmptyResultSet的原因
Django中的QuerySet有些操作会导致EmptyResultSet异常的出现,比如以下情况:
-
QuerySet对象调用first、last,但是查询的结果集为空。
-
使用filter或exclude方法过滤查询结果时,没有符合条件的结果集。
-
使用Q对象或Q对象的“|”、"&"等运算符进行复杂查询时,没有符合条件的结果集。
-
使用annotate、aggregate等方法时,没有符合条件的结果集。
常见的错误提示
当出现EmptyResultSet异常时,Django会抛出类似以下信息的错误提示:
EmptyResultSet: Update query did not affect any rows.
EmptyResultSet: Reverse for 'xxxxx' not found. 'xxxxx' is not a valid view function or pattern name.
解决办法
-
先判断QuerySet是否为空,可以使用count()方法。
-
对于调用first、last方法,可以使用exists()方法来判断是否存在符合条件的记录。
-
如果使用filter或exclude方法,可以先使用values()方法,查看条件过滤后的结果。
-
使用Q对象或Q对象的“|”、“&”等运算符时,可以使用Q对象的bool方法,判断Q对象是否为空。
-
在使用annotate、aggregate等方法时,可以加上default参数,指定当没有符合条件的结果集时,返回的默认值。
-
如果不需要查询结果,只需要判断是否存在符合条件的记录,可以使用exists()方法。
-
在使用reverse方法时,需要确保对应的视图函数或URL存在。
完整代码示例
QuerySet的first、last方法
qs = MyModel.objects.filter(field_a='xxx').order_by('-field_b')
if qs.exists():
first_obj = qs.first()
last_obj = qs.last()
else:
# 没有符合条件的结果集
使用filter或exclude方法过滤查询结果
qs = MyModel.objects.filter(field_a='xxx')
if qs.count() > 0:
obj_list = qs.values('field_a', 'field_b')
else:
# 没有符合条件的结果集
使用Q对象或Q对象的“|”、“&”等运算符进行复杂查询
q1 = Q(field_a='xxx')
q2 = Q(field_b='yyy')
qs = MyModel.objects.filter(q1 | q2)
if qs:
# 存在符合条件的结果集
else:
# 没有符合条件的结果集
使用annotate、aggregate等方法
from django.db.models import Avg
avg_score = MyModel.objects.filter(field_a='xxx').aggregate(Avg('score'), default=0.0)['score__avg']
判断是否存在符合条件的记录
has_record = MyModel.objects.filter(field_a='xxx').exists()
使用reverse方法
from django.urls import reverse
try:
url = reverse('viewname')
except:
# 对应的视图函数或URL不存在
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django报”EmptyResultSet “的原因以及解决办法 - Python技术站