无法捕获django order_by FieldError异常

无法捕获django order_by FieldError异常,django,exception,Django,Exception,现在,当我在生成的链接后按有效字段排序时,一切都很完美。当我编辑一个链接并添加一些虚拟字段名进行排序时,它应该被这个异常捕获,并且应该返回原始列表。但这并没有发生,相反,我总是从django那里得到一个FieldError 字段错误位于 无法将关键字u'fgsdfds'解析为字段。选择是:…这意味着有输入错误,或者异常发生在其他地方。插入调试行: from django.core.exceptions import FieldError #This is a method of a class

现在,当我在生成的链接后按有效字段排序时,一切都很完美。当我编辑一个链接并添加一些虚拟字段名进行排序时,它应该被这个异常捕获,并且应该返回原始列表。但这并没有发生,相反,我总是从django那里得到一个FieldError

字段错误位于


无法将关键字u'fgsdfds'解析为字段。选择是:…

这意味着有输入错误,或者异常发生在其他地方。插入调试行:

from django.core.exceptions import FieldError

#This is a method of a class
def _order_item_list(self, item_list, order_items_by, previous_order_by):
    if order_items_by == previous_order_by:
        order_items_by = '-' + order_items_by 

    try:
        result = item_list.order_by(order_items_by)
    except FieldError:
        result = item_list

    return result, order_items_by

在测试之前,请尝试并查看代码是如何执行的。尝试或调试程序,而不是标准的。当你有一个调试器时,许多问题就会消失,并且可以准确地看到哪里出了问题。

我也遇到了同样的问题,当然是因为异常发生在后面。为了在try-catch块中引发异常,我以以下方式修改了代码:

 import pdb; pdb.set_trace()

这对我有效。

未捕获异常的原因是
QuerySet
尚未计算

要验证用于模型字段的任意(用户指定)值或order\u by值,只需检查该模型是否具有该名称的字段

例如,假设您有一个名为
Ticket
的模型和一个名为
field\u name
的任意GET参数。下面是如何在
views.py
中创建有效的
QuerySet

try:
    result = item_list.order_by(order_items_by)
    **result = list(result)**
except FieldError:
    result = item_list

你完全正确。稍后会出现异常,这肯定是因为django的优化避免了许多单独的db操作。。。谢谢这是个坏主意,因为list()强制对QuerySet求值并将其加载到内存中。请参阅我发布的答案以获得更好的解决方案。降序排列不适用于Django 1.10中的
-field\u name
get\u field\u by\u name(name)
已被弃用。使用
get\u field(name)
代替。问题是,如果按降序
'-field\u name'
或外键
'field\u fkname'
排序,则必须调整输入。还有别的方法可以抓住这些吗?
from django.db.models import FieldDoesNotExist
from myapp.models import Ticket

def index(request):
    default_field = 'id'
    field_name = request.GET.get('field_name', default_field)

    try:
        Ticket._meta.get_field_by_name(field_name)
    except FieldDoesNotExist:
        field_name = default_field

    tickets = Ticket.objects.all().order_by(field_name)
    return ...