Форум сайта python.su
решил чуть чуть оптимизировать запросы к БД.
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)
Офлайн
Я понимаю, что записей BlogCategory в БД немного, но твой подход в принципе далек от понятия “оптимизация”, ведь в цикле на каждой итерации у тебя получается новый запрос к базе - BlogPost.objects.filter. Будет 100 категорий, получишь 100 запросов. Нот гуд. Если покумекать, то посты можно сгруппировать по категориям сразу в одном запросе - GROUP BY. Хотя в джанге это и реализовано через джопу.
Офлайн
ну да. я пытался как то свести все к минимальному количеству запросов.
Но мне именно надо на каждую категорию как бы отдельный список.
Поэтому я решил что это не критично. 100 категории явно не будет. Не более 10.
на счет group_by забыл. надо поюзать.
спасибо.
Офлайн
Вот за это
_result.append(BlogPost.objects.filter(category__url=category)\
поставил бы в угол…
P.S. Уберите это? Что-нибудь изменилось?
Отредактировано 4kpt (Июнь 27, 2013 22:13:27)
Офлайн
Офлайн
В 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)
Офлайн
спасибо. Тоже вариант.
Офлайн