Задать вопрос
Sergei_Erjemin
@Sergei_Erjemin
Улыбайся, будь самураем...

Как заставить Django через ORM к INNER JOIN добавлять GROUP BY?

Собственно есть model.py (не важно какая) и в ней куча связанных таблиц (но все нормально, без петлей и дублирования, все более-менее нормализовано). И вот строится приметно такой запрос:

q=BlogPost.objects.\
        order_by('-dPostDataCreate', 'kBlogAuthorUser__id').\
        select_related()
print q.query

Который порождает SQL:
SELECT
    `все-все-все-поля-из-всех-всех-всех-связанных-таблиц-через-запятую`
FROM prj_blogpost
    INNER JOIN prj_ouruser ON ( prj_blogpost.kBlogAuthorUser_id = prj_ouruser.id )
    INNER JOIN auth_user ON ( prj_ouruser.kDjangoUser_id = auth_user.id )
ORDER BY
    prj_blogpost.dPostDataCreate DESC,
    prj_blogpost.kBlogAuthorUser_id ASC

Как вы догадались в моделе часть таблиц связано через ForeignKey с встроенным в Django классом User, но не это важно. А важно, что доступа в полям в связанных таблицах подступиться не получается. Т.е. что-то вроде вот такого:
for cnt in q:
        print cnt.username

Порождает ошибку:
Exception Value:	'BlogPost' object has no attribute 'username'

И это справедливо, т.к. для того чтобы все работало нужно, чтобы ORM породил немного другой запрос:
SELECT
    `все-все-все-поля-из-всех-всех-всех-связанных-таблиц-через-запятую`
FROM prj_blogpost
    INNER JOIN prj_ouruser ON ( prj_blogpost.kBlogAuthorUser_id = prj_ouruser.id )
    INNER JOIN auth_user ON ( prj_ouruser.kDjangoUser_id = auth_user.id )
GROUP BY
    `все-все-все-поля-из-всех-всех-всех-связанных-таблиц-через-запятую` 
ORDER BY
    prj_blogpost.dPostDataCreate DESC,
    prj_blogpost.kBlogAuthorUser_id ASC

Собственно вопрос заключается в том, как ORM заставить этот GROUP BY
`все-все-все-поля-из-всех-всех-всех-связанных-таблиц-через-запятую`
добавить к запросу?
  • Вопрос задан
  • 886 просмотров
Подписаться 2 Оценить 2 комментария
Решения вопроса 1
sim3x
@sim3x
Сергей Еремин: ты меня убиваешь названием переменных в камел кейсе sUserPhone
и префиксами
перепиши как надо, с андескорами и без префиксов

и не надо сокращать имена переменных

posts = BlogPost.objects.\
        order_by('-dPostDataCreate', 'kBlogAuthorUser__id').\
        select_related()

for post in posts:
    print post.kBlogAuthorUser.kDjangoUser.username


и унаследуй своего юзера от AbstractUser и не мучайся с кучей моделей
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы