Найти - Пользователи
Полная версия: filter __contains валит запрос
Начало » Django » filter __contains валит запрос
1 2 3
Nick2009
Ferroman
Воспользуйтесь pdb или logging.exception.
Сразу после вызова запроса pdb выдает
TypeError: TypeErro…erable",)
потом
–Return–
потом декораторы вызываются
и затем
except http.Http404, e:

:\

Я понимаю, что тут не экстрасенсы, но хоть гипотезы есть?
Ошибиться с типом там негде, а 404 ошибка там в помине не должна быть.

Провел такой эксперимент.
Текстовые поля содержащиеся в самой таблице Объектов фильтруются подобными запросами нормально,
...filter(subject__object__textfield__contains='abcd')
но стоит заменить свое поле, на поле name с переводом из таблицы translation,
...filter(subject__object__name__contains='abcd')
сразу ошибка.

При этом, обращения q.subject.object.name показывают правильные переводы.

Этим полем всецело управляет Джанга и приложение multilingual

Еще получаю такие варнинги
c:\webserver\usr\local\python\2.5.1\lib\site-packages\django_multilingual-0.1.0-
py2.5.egg\multilingual\admin.py:179: DeprecationWarning: <class 'myapp.models.
Obj'> should be registered with a subclass of of multilingual.ModelAdmin.
" of multilingual.ModelAdmin." % model, DeprecationWarning)
что сие значит? Вроде у меня во всех классах с переводами эти субклассы объявлены иначе бы не работало то, что работает.
ziro
Посмотрите что передается, а главное возвращается через ajax. Самый простой метод - взять firefox+firebug и посмотреть что летает к сайту, от сайта на вкладке “Сеть” в файрбаге. Есть мнение, что там возвращается 500 ошибка. Чего там возвращает сервер можно глянуть щелкнув правой кнопкой на нужном url и выбрать “Открыть в новом окне”.
Nick2009
ziro
Посмотрите что передается, а главное возвращается через ajax. Самый простой метод - взять firefox+firebug и посмотреть что летает к сайту, от сайта на вкладке “Сеть” в файрбаге. Есть мнение, что там возвращается 500 ошибка. Чего там возвращает сервер можно глянуть щелкнув правой кнопкой на нужном url и выбрать “Открыть в новом окне”.
Вы не поняли. Этот метод не поможет и ajax тут не при чем, и ошибки типа 404 и 500 там близко не должно быть. Ошибка возникает внутри генератора запроса. Конкретно, проблема в том, что Djangо не понимает какой запрос требуется создать или не может его построить. Таблица перевода вообще не подключается в запросе, в результате чего фильтр по полю name__contains и вообще любые фильтры по name вызывают ошибку на этапе генерации или начала исполнения.

Обойти это я могу, например не указывая name__contains, а затем построив новый список из результата выборки генератором . Но такой код, будет очень медленным и ресурсоемким, делать отдельные, довольно тяжелые, запросы для каждой записи в выборке для получения name. Такой метод намного хуже RAW SQL. Пока вижу решение в собственном велосипеде, но не хотелось бы это сейчас делать, слишком много работы.
poltergeist
Nick2009
Djangо не понимает
Djangо не умеет читать ваши мысли, она либо сделает что ей велено сделать, либо выдаст сообщение об ошибке, чтобы вы имели возможность понять в чём вы не правы. Ещё Django - это не чёрный ящик, состояние которого описывается лишь по ответу HTTP сервера. Тыкать пальцем в небо нет смысла, т.к. у вас есть исходники и средства (методы) отладки.
Nick2009
Ошибка возникает внутри генератора запроса
Такие ошибки (исключения) никем не проглатываются, и никто не мешает вам обернуть подозрительную конструкцию в try … except и вывести print-ом сообщение об ошибке - это самый простой метод отладки.
Nick2009
poltergeist
Nick2009
Djangо не понимает
Djangо не умеет читать ваши мысли, она либо сделает что ей велено сделать, либо выдаст сообщение об ошибке, чтобы вы имели возможность понять в чём вы не правы. Ещё Django - это не чёрный ящик, состояние которого описывается лишь по ответу HTTP сервера. Тыкать пальцем в небо нет смысла, т.к. у вас есть исходники и средства (методы) отладки.
Nick2009
Ошибка возникает внутри генератора запроса
Такие ошибки (исключения) никем не проглатываются, и никто не мешает вам обернуть подозрительную конструкцию в try … except и вывести print-ом сообщение об ошибке - это самый простой метод отладки.
Не знаешь ответ, зачем пишешь?.
Ferroman
Nick2009
ВЫ сами не видите что чворится в вашем “чёрном ящике”, но верите в то, что увидят другие?
Вот это:
Сразу после вызова запроса pdb выдает
TypeError: TypeErro…erable",)
потом
–Return–
потом декораторы вызываются
и затем
except http.Http404, e:
Тотально неинформативно.
Nick2009
Ferroman
Nick2009
ВЫ сами не видите что чворится в вашем “чёрном ящике”, но верите в то, что увидят другие?
Вот это:
Сразу после вызова запроса pdb выдает
TypeError: TypeErro…erable",)
потом
–Return–
потом декораторы вызываются
и затем
except http.Http404, e:
Тотально неинформативно.
Конечно не информативно! Я еще от себя информации добавил.
Я же уже сам объясняю вам в чем проблема.
Да сами проверьте на аналогичном примере.
poltergeist
Nick2009
Да сами проверьте на аналогичном примере.
Тогда с тебя тестовый пример, который демонстрирует проблему. Такой, чтобы ./manage.py runserver и мы смогли бы увидеть ошибку и тебе помочь.
regall
Nick2009, вы наверное очень много работали с SQL. Из всего треда этого складывается впечатление, что вы хотите заставить ОРМ сгенерировать нужный вам запрос не по смыслу, а посимвольно.

ОРМ - это инструмент предназначенный для облегчения работы с БД и для переносимости, а не для того чтобы его мучить. Естественно он не покрывает всего, что можно сделать с помощью SQL, и дело даже не в джанговском ОРМе, даже Алхимия всего не умеет.

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

Nick2009
.select_related('onetoone__fk2__name')
Daevaorn
Вы понимаете что этот вызов не имеет смысла?
В контексте вышесказанного, я бы скорее сказал, что этот вызов не имеет здравого смысла.
Nick2009
regall
Nick2009, вы наверное очень много работали с SQL. Из всего треда этого складывается впечатление, что вы хотите заставить ОРМ сгенерировать нужный вам запрос не по смыслу, а посимвольно.

ОРМ - это инструмент предназначенный для облегчения работы с БД и для переносимости, а не для того чтобы его мучить. Естественно он не покрывает всего, что можно сделать с помощью SQL, и дело даже не в джанговском ОРМе, даже Алхимия всего не умеет.

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

Nick2009
.select_related('onetoone__fk2__name')
Daevaorn
Вы понимаете что этот вызов не имеет смысла?
В контексте вышесказанного, я бы скорее сказал, что этот вызов не имеет здравого смысла.
Вы наверное читать не умеете? Я уже написал, что давно поправил это, хотя это никак не влияет на работу.
Ничего я от ORM особенного не хочу. Я по русски написал чего я хочу, а если Вы не знаете как такой запрос построить и почему он так глухо сваливается, так нефиг советы давать космического масштаба. Простенький пример на SQL привел просто для примера. Если пресветлая Джанга как-то по другому его построит так флаг ей в руки, только без ‘name’ оно мне не надо.

Так имеет смысл?
q = Table1.objects.select_related('field1__field2').filter(field1__field2__name='уй')
А так?
q = Table1.objects.filter(field1__field2__name='уй')
q = Table2.objects.filter(field2__name='уй')
q = Table3.objects.filter(name='уй')
Это что-то очень сложное?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB