Django报”EmptyResultSet “的原因以及解决办法

会出现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.

解决办法

  1. 先判断QuerySet是否为空,可以使用count()方法。

  2. 对于调用first、last方法,可以使用exists()方法来判断是否存在符合条件的记录。

  3. 如果使用filter或exclude方法,可以先使用values()方法,查看条件过滤后的结果。

  4. 使用Q对象或Q对象的“|”、“&”等运算符时,可以使用Q对象的bool方法,判断Q对象是否为空。

  5. 在使用annotate、aggregate等方法时,可以加上default参数,指定当没有符合条件的结果集时,返回的默认值。

  6. 如果不需要查询结果,只需要判断是否存在符合条件的记录,可以使用exists()方法。

  7. 在使用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技术站

(0)
上一篇 2023年3月17日
下一篇 2023年3月17日

相关文章

合作推广
合作推广
分享本页
返回顶部