Найти - Пользователи
Полная версия: QuerySet method EXTRA ошиба или нет?
Начало » Django » QuerySet method EXTRA ошиба или нет?
1 2
romankrv
Здраствуйте.

код который хочу запихнуть в objects.extra:
SELECT count (*) FROM feedback_reviews,feedback_goods where feedback_reviews.goods_id=feedback_goods.id and feedback_goods.id=1
(Это работает в консоли мускуля)

Теперь в шелле пайтона пишу :
s = Goods.objects.extra(
select={
'entry_count': 'SELECT count (*) FROM feedback_reviews,feedback_goods where feedback_reviews.goods_id=feedback_goods.id'
},
)
и получаю ошибку
“<class ‘_mysql_exceptions.ProgrammingError’>: (1064, ”You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘*) FROM feedback_reviews,feedback_goods where feedback_reviews.goods_id=feedback’ at line 1“)

версия mysql 5+

зы
по ходу вопрос это почему в документации в селекте после ключевого слова FROM прописана одна таблица хотя скрипт делает выборку из двух связанных таблицах. Или джанга сама добирает название недостающие после фром

Спасибо заранее ответившим
EXSlim
всё гораздо проще) уберите пробел между именем функции count и скобками
slav0nic
а зачем через extra? метод count() вроде есть же
Александр Кошелев
romankrv
по ходу вопрос это почему в документации в селекте после ключевого слова FROM прописана одна таблица хотя скрипт делает выборку из двух связанных таблицах. Или джанга сама добирает название недостающие после фром
Джанга тут не причем. Просто внешний запрос(по отношению к этому) и так имееn правильный `FROM` c таблицей `goods`
romankrv
В продолжении темы возник вопрос:

В документации написано что после этого кода у меня появиться дополнительный атрибут у каждого объекта…

цитата:
As a result, each Entry object will have an extra attribute, is_recent, a boolean representing whether the entry’s pub_date is greater than Jan. 1, 2006.

но я хочу спосить так как этого атрибута я в упор не вижу и ipython его не выводит
в доке
http://www.djangoproject.com/documentation/db-api/#extra-select-none-where-none-params-none-tables-none-order-by-none-select-params-none
как то обтекаемо описано про это и нет примера использования этого атрибута “is_recent”
мой код
s = Goods.objects.extra(
select={
‘is_recent": ’SELECT count(*) FROM feedback_reviews,feedback_goods where feedback_reviews.goods_id=feedback_goods.id'
},
)




Еще один момент

цитата из того же раздела: Note that the parenthesis required by most database engines around subqueries are not required in Django’s select clauses. Also note that some database backends, such as some MySQL versions, don’t support subqueries.

ну здесь по английскии написано что мускуль на поддерживает подзапросы

Но идем на http://dev.mysql.com/doc/refman/4.1/en/subqueries.html
из официальной доки мускуля получается что можно и оно работает проверял

Кто то может разъяснить почему так или здесь что то имелося другое ввиду neutral


Спасибо
romankrv
Пока единственное что я понял что с помощью этой конструкцией можно создавать только куски запроса sql
а для конструкция типа
objects.extra(
select={
‘entry_count’:тело запроса

где тело запроса это есть подзапрс главного запроса идущего от имя.object ….


То есть я пришел к выводу что с помощь этой конструкции нельзя сделать запрос не содержащий подзапросы то есть просто нельзя набрать запрос и получить кверисет на него
например
SELECT count(*) FROM feedback_reviews,feedback_goods where feedback_reviews.goods_id=feedback_goods.id and feedback_goods.id=3

Прав ли я если нет то где я не прав?

Спасибо

зы
и как я понял эти снипеты (куски кода) для extra(
select={ вставляются только до служебного слова FROM и нет возможности после where?
Александр Кошелев
romankrv
В документации написано что после этого кода у меня появиться дополнительный атрибут у каждого объекта…
Да.
romankrv
Кто то может разъяснить почему так или здесь что то имелося другое ввиду neutral
ну написано, что
some MySQL versions
romankrv
Пока единственное что я понял что с помощью этой конструкцией можно создавать только куски запроса sql
Да. Применительно к select - подзапросы.
romankrv
То есть я пришел к выводу что с помощь этой конструкции нельзя сделать запрос не содержащий подзапросы то есть просто нельзя набрать запрос и получить кверисет на него
Да. Для обычных запросов есть механизм ORM
romankrv
вставляются только до служебного слова FROM и нет возможности после where?
У extra есть и другие параметры
romankrv
Спасибо Daevaorn-у за содержательный ответ

PS
Единственное что я не понял как же использовать ключ
Example:
Entry.objects.extra(select={'is_recent': "pub_date > '2006-01-01'"})
например ‘is_recent’
не вижу его в пространстве имен.

Спасибо
Александр Кошелев
romankrv
не вижу его в пространстве имен.
Значит не так смотришь.

PS: Кстати, не пренебрегай тегом , а то трудно воспринимать код, который ты пишешь в форуме.
romankrv
slav0nic
а зачем через extra? метод count() вроде есть же
Вот разобрался с методом extra() спасибо Daevaorn. Оказалось что главная проблема была в том что я искал ключ екстра параметра в QuerySet-е

а вот вопрос к slav0nic как у него получиться на методе count() подсчитать количество записей в двух связанных таблицах M2One например
Спасибо
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