В 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]
навскидку, тот же результат получите