Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
regions_id = RegionSite.objects.filter(id__lte=10).values_list("id", flat=True)
for n in News.objects.filter(region__id__in=regions_id):
print n.region_id
for n in News.objects.select_related('region').filter(region__id__lte=10):
print n.region_id
Рассмотрен и тот и тот пример. А так же разница между ними. Внимательней, пожалуйста, читайте… внимательней :(
Подготавливаем список интересующих нас id-шников регионов по какому-то абстрактному условию.
Вся информация взята по мотивам Django версии 1.3.4
Гляньте, например, на bitbucket.org — снизу страницы версии ПО
Говорим про HL проект, который долго делали и развиваем.
А не про мелкие штамповки на пару тысяч строк кода.
Как правило это останавливает к «быстрому» переходу на новую версию.
news = News.objects.all().select_related('region').order_by("-date")[:10]User.objects.values('username', 'email').annotate(cnt=Count('id')).filter(cnt__gt=1).order_by('-cnt')regions_id = list(News.objects.all().values_list("region_id", flat=True))
print RegionSite.objects.filter(id__in=regions_id)
хорошие вещи: админка
list(News.objects.filter(region__in=[1]).values("id")[:10])
list(News.objects.filter(region__id__in=[1]).values("id")[:10])
>>> print News.objects.filter(region__in=[1]).values("id").query
SELECT `news_news`.`id` FROM `news_news` INNER JOIN `news_region` ON (`news_news`.`id` = `news_region`.`news_id`) WHERE `news_region`.`id` IN (1)
>>> print News.objects.filter(region__id__in=[1]).values("id").query
SELECT `news_news`.`id` FROM `news_news` INNER JOIN `news_region` ON (`news_news`.`id` = `news_region`.`news_id`) WHERE `news_region`.`id` IN (1)
Утверждение: Все нечетные числа — простые.
Доказательство: 3 — простое, 5 — простое, 7 — простое и т.д.
book_list.order_by('-rating_score')[:10] # выдаёт 10 книг совершенно не отсортированных по rating_score
book_list.filter(rating_score__gt=-1000).order_by('-rating_score')[:10] # список книг выдаётся ожидаемыйТеперь что насчет Django, стандартный сайтик на нем дерит около 30-70RPS. Точно такой же сайтик к примеру на Gevent держит 800-1500RPS.
Короче Django да еще и со своей ОРМ это и близко не HL тулзы.
Вы не путайте Twisted и Gevent с Django. Это абсолютно разные фреймы.
Вы конечне простите но мой один хттп сервер держит больше чем пачка джанг. Вопрос нахрена платить больше? А еще и заниматся администрированием 10 машин и 200 машин разница существенная.
Я дописывал торнадо до первой версии, было много траблов с ивентлупом и блокировками.
А Джанго это дох апи, поднятие гуниеорна или нджинкса с модулями под wsgi.
Да просто смотрит наружу, если не надо балансировки.
Торнадовский луп бажил, в версии до 1
дофига грязных хаков что бы оно не висло
Вот FB говорит что юзает PHP, но их инженеры по секрету грят что это пиздежь полный и PHP там особой роли не играетнасколько мне известно, они используют hiphop, а это не совсем PHP в его типичном понимании. Да и даже если PHP, то ничего удивительно — такие проекты как Wikipedia или VK тоже крутятся на PHP и нормуль
regions_id = list(News.objects.all().values_list("region_id", flat=True))
print RegionSite.objects.filter(id__in=set(regions_id)))
set() когда есть .distinct()?regions_id = list(News.objects.all().distinct().values_list("region_id", flat=True))
print RegionSite.objects.filter(id__in=regions_id))
.distinct() дешевая операция и есть мысли что это выгоднее чем посылать лишние байты по сети, а потом еще их обрабатывать на app машине. Начну с классической ошибки, которая меня преследовала довольно долго. Я очень сильно верил во всемогучесть Django ORM, а именно в Klass.objects.all()
Попробуем поиграться с шаблонами, и любимой некоторыми функцией __unicode__().
Нас так просто не возьмешь — всхлипнули мы и воспользовались следующей отличной возможностью ORM — .values().
Для этого забъем на наши предрассудки по количеству запросов и в срочном порядке увеличиваем количество запросов в 2 раза! А именно, займемся подготовкой данных:
Получившийся результат вставляем в наш новостной запрос и получаем: Запрос в запросе! Уууух, обожаю :) Вы конечно же понимаете чем это грозит? :) Если нет — то поймите — ничем, совершенно ни чем хорошим!
так он еще взял откуда-то limit 21. Про лимит все просто — так устроен print большого количества значений массива
урлы… вот в чем жесть
select id, name from table1 where id2 in (select id from table 2)

select id, name from table1 where id2 in (select id from table 2)
Один запрос с JOIN-ом на базе будет быстрее чем 2 запроса и JOIN на стороне питона как минимум из-за того что не надо 2 раза гонять данные.Вот кстати совершенно не факт. Смотря что за БД используется. Если отталкиваться от MySQL, то есть ситуации когда вместо JOIN лучше сделать два запроса и склеить данные в коде
Все хорошо и в меру, пока у вас не появятся более одного джойна
Заметки для построения эффективных Django-ORM запросов в нагруженных проектах