django order_by无法捕获FieldError异常

时间:2011-08-24 10:20:39

标签: django exception

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

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

FieldError at ...

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

3 个答案:

答案 0 :(得分:4)

未捕获异常的原因是因为尚未评估QuerySet

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

例如,假设您有一个名为Ticket的模型和一个名为field_name的任意GET参数。以下是您在QuerySet中创建有效views.py的方法:

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 ...

答案 1 :(得分:1)

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

 import pdb; pdb.set_trace()
在try-except之前

并查看代码是如何执行的。尝试使用PUDBIPDB调试程序而不是标准调试程序。当你有一个调试器时,很多问题都会消失,并且可以确切地看出出了什么问题。

答案 2 :(得分:0)

我遇到了同样的问题,肯定是因为异常是后来的。为了在try-catch块中引发异常,我按以下方式修改了代码:

尝试:     result = item_list.order_by(order_items_by)     结果=列表(结果) 除了FieldError:     result = item_list

这对我有用。