Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 27, 2013 11:51:13

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

вычисление запроса

решил чуть чуть оптимизировать запросы к БД.

for category in BlogCategory.objects.values_list('url', flat=True):
        _result.append(BlogPost.objects.filter(category__url=category)\
            .values('name', 'url', 'created', 'category__url', 'category__name',
            'count_views', 'count_comments'))
result.append(_result)
если я правильно понимаю, кверисет в result.append(…) не вычислится сразу?
или как?
Мне надо добавить в _result словарь.

Офлайн

#2 Июнь 27, 2013 13:25:56

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

вычисление запроса

Я понимаю, что записей BlogCategory в БД немного, но твой подход в принципе далек от понятия “оптимизация”, ведь в цикле на каждой итерации у тебя получается новый запрос к базе - BlogPost.objects.filter. Будет 100 категорий, получишь 100 запросов. Нот гуд. Если покумекать, то посты можно сгруппировать по категориям сразу в одном запросе - GROUP BY. Хотя в джанге это и реализовано через джопу.



Офлайн

#3 Июнь 27, 2013 13:33:03

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

вычисление запроса

ну да. я пытался как то свести все к минимальному количеству запросов.
Но мне именно надо на каждую категорию как бы отдельный список.
Поэтому я решил что это не критично. 100 категории явно не будет. Не более 10.
на счет group_by забыл. надо поюзать.

спасибо.

Офлайн

#4 Июнь 27, 2013 22:10:41

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

вычисление запроса

Вот за это
_result.append(BlogPost.objects.filter(category__url=category)\
поставил бы в угол…

P.S. Уберите это? Что-нибудь изменилось?



Отредактировано 4kpt (Июнь 27, 2013 22:13:27)

Офлайн

#5 Июнь 28, 2013 06:23:04

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

вычисление запроса

4kpt
Что-нибудь изменилось?
вроде нет.
:)

Офлайн

#6 Июнь 28, 2013 11:47:44

Sergei
От:
Зарегистрирован: 2011-10-04
Сообщения: 29
Репутация: +  4  -
Профиль   Отправить e-mail  

вычисление запроса

В result вы хотите получить “список списков словарей, сгруппированных по category” ?
На каждой итерации запрос конечно нехорошо, если бы был нормальный group by было бы конечно правильней им, но нет его. Эмуляция через annotate (extra/raw тоже плохо).
Как вариант, можно попользоваться подвернувшимся под руку питоном, что-то типа:

# get all categories - query 1
target_categories = BlogCategory.objects.distinct('url').values_list('url', flat=True)
# get all blogposts - query 2 
all_blogposts = BlogPost.objects.values('name', 'url', 'created', 'category__url', 'category__name','count_views', 'count_comments')
# make a list of dict lists sorted by values of 'url' dict keys
result = [filter(lambda i_blogpost, i_category=i_category: i_blogpost['url']==i_category, all_blogposts) for i_category in target_categories]
навскидку, тот же результат получите



Отредактировано Sergei (Июнь 28, 2013 11:48:43)

Офлайн

#7 Июнь 28, 2013 12:35:40

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

вычисление запроса

спасибо. Тоже вариант.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version