Найти - Пользователи
Полная версия: вычисление запроса
Начало » Django » вычисление запроса
1
ilnur
решил чуть чуть оптимизировать запросы к БД.
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 словарь.
FishHook
Я понимаю, что записей BlogCategory в БД немного, но твой подход в принципе далек от понятия “оптимизация”, ведь в цикле на каждой итерации у тебя получается новый запрос к базе - BlogPost.objects.filter. Будет 100 категорий, получишь 100 запросов. Нот гуд. Если покумекать, то посты можно сгруппировать по категориям сразу в одном запросе - GROUP BY. Хотя в джанге это и реализовано через джопу.
ilnur
ну да. я пытался как то свести все к минимальному количеству запросов.
Но мне именно надо на каждую категорию как бы отдельный список.
Поэтому я решил что это не критично. 100 категории явно не будет. Не более 10.
на счет group_by забыл. надо поюзать.

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

P.S. Уберите это? Что-нибудь изменилось?
ilnur
4kpt
Что-нибудь изменилось?
вроде нет.
:)
Sergei
В 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]
навскидку, тот же результат получите
ilnur
спасибо. Тоже вариант.
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