исключение django order_by FieldError не может быть перехвачено - PullRequest
3 голосов
/ 24 августа 2011
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

Теперь, когда я делаю заказ по действующим полям, следуя сгенерированной ссылке, все работает отлично. Когда я редактирую ссылку и добавляю несколько фиктивных имен полей для упорядочения, это исключение должно отслеживаться, и должен возвращаться исходный список. Но этого не происходит, вместо этого я всегда получаю FieldError от django.

FieldError at ...

Невозможно разрешить ключевое слово u'fgsdffds 'в поле. Варианты: ...

Ответы [ 3 ]

4 голосов
/ 27 июня 2013

Причина, по которой исключение не перехвачено, состоит в том, что QuerySet еще не был оценен.

Чтобы проверить произвольное (указанное пользователем) значение, используемое для поля модели, или значение order_by, простопроверьте, есть ли в этой модели поле с таким именем.

Например, скажем, у вас есть модель с именем Ticket и произвольный параметр GET с именем field_name.Вот как вы можете справиться с созданием действительного 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 голос
/ 24 августа 2011

Это означает, что есть опечатка, или исключение происходит в другом месте. Вставьте строку отладки:

 import pdb; pdb.set_trace()

перед попыткой-исключением и посмотрите, как выполняется код. Попробуйте PUDB или IPDB отладчики вместо стандартного. Многие вопросы исчезают, когда у вас есть отладчик, и вы можете точно увидеть, что идет не так.

0 голосов
/ 07 июня 2013

Я столкнулся с той же проблемой, и, конечно, это было потому, что исключение позже. Чтобы вызвать исключение в блоке try-catch, я изменил код следующим образом:

попробовать: результат = item_list.order_by (order_items_by) результат = список (результат) кроме FieldError: результат = item_list

Это сработало для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...