Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 15, 2010 01:04:41

Nick2009
От:
Зарегистрирован: 2009-06-24
Сообщения: 161
Репутация: +  0  -
Профиль   Отправить e-mail  

filter __contains валит запрос

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)
что сие значит? Вроде у меня во всех классах с переводами эти субклассы объявлены иначе бы не работало то, что работает.



Отредактировано (Фев. 15, 2010 02:40:35)

Офлайн

#2 Фев. 15, 2010 09:04:29

ziro
От:
Зарегистрирован: 2009-08-13
Сообщения: 225
Репутация: +  8  -
Профиль   Отправить e-mail  

filter __contains валит запрос

Посмотрите что передается, а главное возвращается через ajax. Самый простой метод - взять firefox+firebug и посмотреть что летает к сайту, от сайта на вкладке “Сеть” в файрбаге. Есть мнение, что там возвращается 500 ошибка. Чего там возвращает сервер можно глянуть щелкнув правой кнопкой на нужном url и выбрать “Открыть в новом окне”.



Офлайн

#3 Фев. 15, 2010 12:26:24

Nick2009
От:
Зарегистрирован: 2009-06-24
Сообщения: 161
Репутация: +  0  -
Профиль   Отправить e-mail  

filter __contains валит запрос

ziro
Посмотрите что передается, а главное возвращается через ajax. Самый простой метод - взять firefox+firebug и посмотреть что летает к сайту, от сайта на вкладке “Сеть” в файрбаге. Есть мнение, что там возвращается 500 ошибка. Чего там возвращает сервер можно глянуть щелкнув правой кнопкой на нужном url и выбрать “Открыть в новом окне”.
Вы не поняли. Этот метод не поможет и ajax тут не при чем, и ошибки типа 404 и 500 там близко не должно быть. Ошибка возникает внутри генератора запроса. Конкретно, проблема в том, что Djangо не понимает какой запрос требуется создать или не может его построить. Таблица перевода вообще не подключается в запросе, в результате чего фильтр по полю name__contains и вообще любые фильтры по name вызывают ошибку на этапе генерации или начала исполнения.

Обойти это я могу, например не указывая name__contains, а затем построив новый список из результата выборки генератором . Но такой код, будет очень медленным и ресурсоемким, делать отдельные, довольно тяжелые, запросы для каждой записи в выборке для получения name. Такой метод намного хуже RAW SQL. Пока вижу решение в собственном велосипеде, но не хотелось бы это сейчас делать, слишком много работы.



Отредактировано (Фев. 15, 2010 13:19:09)

Офлайн

#4 Фев. 15, 2010 15:19:57

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

filter __contains валит запрос

Nick2009
Djangо не понимает
Djangо не умеет читать ваши мысли, она либо сделает что ей велено сделать, либо выдаст сообщение об ошибке, чтобы вы имели возможность понять в чём вы не правы. Ещё Django - это не чёрный ящик, состояние которого описывается лишь по ответу HTTP сервера. Тыкать пальцем в небо нет смысла, т.к. у вас есть исходники и средства (методы) отладки.
Nick2009
Ошибка возникает внутри генератора запроса
Такие ошибки (исключения) никем не проглатываются, и никто не мешает вам обернуть подозрительную конструкцию в try … except и вывести print-ом сообщение об ошибке - это самый простой метод отладки.



Офлайн

#5 Фев. 15, 2010 16:18:33

Nick2009
От:
Зарегистрирован: 2009-06-24
Сообщения: 161
Репутация: +  0  -
Профиль   Отправить e-mail  

filter __contains валит запрос

poltergeist
Nick2009
Djangо не понимает
Djangо не умеет читать ваши мысли, она либо сделает что ей велено сделать, либо выдаст сообщение об ошибке, чтобы вы имели возможность понять в чём вы не правы. Ещё Django - это не чёрный ящик, состояние которого описывается лишь по ответу HTTP сервера. Тыкать пальцем в небо нет смысла, т.к. у вас есть исходники и средства (методы) отладки.
Nick2009
Ошибка возникает внутри генератора запроса
Такие ошибки (исключения) никем не проглатываются, и никто не мешает вам обернуть подозрительную конструкцию в try … except и вывести print-ом сообщение об ошибке - это самый простой метод отладки.
Не знаешь ответ, зачем пишешь?.



Отредактировано (Фев. 15, 2010 16:19:26)

Офлайн

#6 Фев. 15, 2010 17:14:57

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

filter __contains валит запрос

Nick2009
ВЫ сами не видите что чворится в вашем “чёрном ящике”, но верите в то, что увидят другие?
Вот это:

Сразу после вызова запроса pdb выдает
TypeError: TypeErro…erable",)
потом
–Return–
потом декораторы вызываются
и затем
except http.Http404, e:
Тотально неинформативно.

Офлайн

#7 Фев. 15, 2010 17:58:21

Nick2009
От:
Зарегистрирован: 2009-06-24
Сообщения: 161
Репутация: +  0  -
Профиль   Отправить e-mail  

filter __contains валит запрос

Ferroman
Nick2009
ВЫ сами не видите что чворится в вашем “чёрном ящике”, но верите в то, что увидят другие?
Вот это:
Сразу после вызова запроса pdb выдает
TypeError: TypeErro…erable",)
потом
–Return–
потом декораторы вызываются
и затем
except http.Http404, e:
Тотально неинформативно.
Конечно не информативно! Я еще от себя информации добавил.
Я же уже сам объясняю вам в чем проблема.
Да сами проверьте на аналогичном примере.



Отредактировано (Фев. 15, 2010 18:29:01)

Офлайн

#8 Фев. 15, 2010 22:42:55

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

filter __contains валит запрос

Nick2009
Да сами проверьте на аналогичном примере.
Тогда с тебя тестовый пример, который демонстрирует проблему. Такой, чтобы ./manage.py runserver и мы смогли бы увидеть ошибку и тебе помочь.



Офлайн

#9 Фев. 16, 2010 11:09:14

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

filter __contains валит запрос

Nick2009, вы наверное очень много работали с SQL. Из всего треда этого складывается впечатление, что вы хотите заставить ОРМ сгенерировать нужный вам запрос не по смыслу, а посимвольно.

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

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

Nick2009
.select_related('onetoone__fk2__name')
Daevaorn
Вы понимаете что этот вызов не имеет смысла?
В контексте вышесказанного, я бы скорее сказал, что этот вызов не имеет здравого смысла.



Отредактировано (Фев. 16, 2010 11:10:43)

Офлайн

#10 Фев. 16, 2010 12:57:25

Nick2009
От:
Зарегистрирован: 2009-06-24
Сообщения: 161
Репутация: +  0  -
Профиль   Отправить e-mail  

filter __contains валит запрос

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='уй')
Это что-то очень сложное?



Отредактировано (Фев. 16, 2010 13:10:00)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version