Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
собирать программный запрос в sql
нужно время на создание объектов по результатам выборок из базы, если конечно не использовать .values()
Достигнуто все это «игрой» с ОРМ.
qs = User.objects.values('username', 'email').annotate(cnt=Count('id')).filter(cnt__gt=1).order_by('-cnt')
print(qs.query)
# SELECT "auth_user"."username", "auth_user"."email", COUNT("auth_user"."id") AS "cnt" FROM "auth_user" GROUP BY "auth_user"."username", "auth_user"."email" HAVING COUNT("auth_user"."id") > 1 ORDER BY "cnt" DESC
qs = User.objects.values('username', 'email').annotate(cnt=Count('id'), first_id=Min('id')).filter(cnt__gt=1).order_by('-cnt')
print(qs.query)
# SELECT "auth_user"."username", "auth_user"."email", COUNT("auth_user"."id") AS "cnt", MIN("auth_user"."id") AS "first_id" FROM "auth_user" GROUP BY "auth_user"."username", "auth_user"."email" HAVING COUNT("auth_user"."id") > 1 ORDER BY "cnt" DESC
Простой и лаконичный запрос мы переписываем на ОРМ, а про себя проговариваем «хм, а может без этого поля… или вот такой хак». А потом смотрим какой же запрос сгенерировала эта ОРМ, вручную проверяем его.
Django ORM, gevent и грабли в зелени