Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何强制对queryset求值,以便在视图中捕获异常_Python_Django_Python 3.x_Django Views - Fatal编程技术网

Python 如何强制对queryset求值,以便在视图中捕获异常

Python 如何强制对queryset求值,以便在视图中捕获异常,python,django,python-3.x,django-views,Python,Django,Python 3.x,Django Views,在视图渲染期间,我抛出了一个操作错误异常 因此,我试图在views.py中渲染之前捕获它 try: dossiersdb = Person.objects.using('dbn').all() print(dossiersdb) except OperationalError as exp : logger.warning("Got %s", exp) return HttpResponse('<h1>OperationalError</h1&

在视图渲染期间,我抛出了一个
操作错误
异常

因此,我试图在
views.py中渲染之前捕获它

try:
    dossiersdb = Person.objects.using('dbn').all()
    print(dossiersdb)
except OperationalError as exp :
    logger.warning("Got %s", exp) 
    return HttpResponse('<h1>OperationalError</h1>')
试试看:
dossiersdb=Person.objects.using('dbn').all()
打印(档案数据库)
除操作错误外,如exp:
记录器。警告(“已获取%s”,exp)
返回HttpResponse('OperationalError')
但是我需要添加
print(dossiersdb)
,因为如果没有它,除了index.html之外,这里没有例外

捕获此异常的正确方法是什么?

您可以使用
list()
强制对查询集进行求值

try:
  dossiersdb = list(Person.objects.using('dbn').all())
except OperationalError as exp :
  logger.warning("Got %s", exp) 
  return HttpResponse('<h1>OperationalError</h1>')
试试看:
dossiersdb=list(Person.objects.using('dbn').all())
除操作错误外,如exp:
记录器。警告(“已获取%s”,exp)
返回HttpResponse('OperationalError')

全局异常挂钩如何

def exception_hook(exctype, value, trace):
    # some exception handling logic here.
    sys.__excepthook__(exctype, value, trace)
sys.excepthook = exception_hook

Person.objects.using('dbn').all()
只是一个查询,而不是执行。执行是在您访问数据时完成的,例如:
list(Person.objects.using('dbn').all())
如果您使用全局异常挂钩,我认为您无法将错误响应返回给用户。如果我使用
list()
dossierdb
queryset是否会计算两次?一个在代码中,另一个在视图中?不,迭代模板中的列表不会导致再次计算queryset。