2011-08-24 165 views
3
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。django order_by FieldError異常無法捕捉到

FieldError在...

無法解析關鍵字u'fgsdffds'到現場。選擇是:...

回答

1

這意味着有一個錯字或其他地方發生異常。插入一條調試線:

import pdb; pdb.set_trace() 

在try-except之前,看看代碼是如何執行的。試用PUDBIPDB調試器而不是標準調試器。當你有一個調試器時,許多問題都會消失,並且可以確切地看到哪裏出了問題。

+0

您是絕對正確的。以後會引發異常,這肯定是因爲django的優化,以避免許多單獨的數據庫操作......謝謝 – andrean

0

我面臨同樣的問題,肯定是因爲異常是後來。爲了提高異常在try-catch塊我修改的代碼在下面的方式:

嘗試: 結果= item_list.order_by(order_items_by) 結果=列表(結果) 除了FieldError: 結果= item_list

這對我有效。

+0

這是一個壞主意,因爲list()強制對QuerySet進行評估並將其加載到內存中。查看我發佈的答案以獲得更好的解決方案 – Sooie

4

未發現異常的原因是因爲QuerySet尚未評估。

要驗證用於模型字段或order_by值的任意(用戶指定)值,只需檢查該模型是否具有該名稱的字段。

例如,假設您有一個名爲Ticket的模型和一個名爲field_name的任意GET參數。以下是您可以如何處理在views.py中創建有效的QuerySet

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

降序大小寫不適用於此「-field_name」 –