Найти - Пользователи
Полная версия: Django агрегация
Начало » Django » Django агрегация
1
Jimbo
Всем доброго времени суток.
Перейду сразу к сути, можно ли, допустим, такой список queryset'ов объединить в один запрос:
 Car.objects.filter(engine=0).order_by('-birthdate')[:10]
Car.objects.filter(engine=1).order_by('-birthdate')[:10]
Car.objects.filter(engine=2).order_by('-birthdate')[:10]
Car.objects.filter(engine=3).order_by('-birthdate')[:10]

Про annotate читал, пробовал, но к данной задаче применить не получилось.
Пробовал сделать через raw обычным sql-запросом - да, работает.
НО! Можно ли это сделать именно средствами ORM?
VadimK
 Car.objects.filter(engine__in=[0,1,2,3]).order_by('-birthdate')[:10]
Или же просьба показать сам sql запрос, что бы понять, что надо в результате.
FishHook
VadimK
Да понятно же, что надо автору: десять самых новых машин с двигателем 1, десять с двигателем 2 и т.д. Ваш запрос сначала отсортирует, а потом пролимитит, а надо наоборот. Один запрос можно сделать так (если вспомнить, что запросы не выполняются, пока их не вызвать)

         sub1 = Car.objects.filter(engine=0).order_by('-birthdate').only("id")[:10]
        sub2 = Car.objects.filter(engine=1).order_by('-birthdate').only("id")[:10]
        sub3 = Car.objects.filter(engine=2).order_by('-birthdate').only("id")[:10]
        sub4 = Car.objects.filter(engine=3).order_by('-birthdate').only("id")[:10]
        cars = Car.objects.filter(Q(id__in=sub1) | Q(id__in=sub2) | Q(id__in=sub3)| Q(id__in=sub4))
Jimbo
FishHook
Наверное отличное решение, только почему-то .only(“id”) возвращает не только id, который соответствует объекту в таблице БД, а некий объект “Car_Deferred_engine_birthdate165d2a59d66bcb6efd86fae72da58d9” в котором, как ни странно, есть и engine, и birthdate.
FishHook
Jimbo
Наверное отличное решение, только почему-то .only(“id”) возвращает не только id, который соответствует объекту в таблице БД
Я ведь вам специально в скобках написал что запросы не выполняются, пока их не вызвать. sub1, sub2 и т.д. это не объект, соответствующий чему-то там в БД, а запрос. Если вы его использутете в другом запросе, то он становится подзапросом, если вы его попробуете выполнить, то есть прочитатете его циклом или кастанете к строке или сделаете с ним что-либо, то ОРМ полезет в БД, выполнит запрос и отобразит полученные данные на объекты модели. И да, в этих объектах будут все поля (ну а куда они денутся то?) только, они будут неинициализированы, и если вы попытаетесь их прочесть, то фреймворк снова полезет за ними в БД.

Если короче “только почему-то .only(“id”) возвращает не только id” - в моем примере он вообще ничего не возвращает, он не ходит в БД вообще и фигурирует лишь в итоговом запросе как подзапрос. Сделайте так

         sub1 = Car.objects.filter(engine=0).order_by('-birthdate').only("id")[:10]
        sub2 = Car.objects.filter(engine=1).order_by('-birthdate').only("id")[:10]
        sub3 = Car.objects.filter(engine=2).order_by('-birthdate').only("id")[:10]
        sub4 = Car.objects.filter(engine=3).order_by('-birthdate').only("id")[:10]
        cars = Car.objects.filter(Q(id__in=sub1) | Q(id__in=sub2) | Q(id__in=sub3)| Q(id__in=sub4))
        print cars.query 
Jimbo
FishHook

Насчет того, что не выполняются я понял, просто я в отладке значения просматривал.
А просматривал я их за тем, что при выполнении строки
 cars = Car.objects.filter(Q(id__in=sub1) | Q(id__in=sub2) | Q(id__in=sub3)| Q(id__in=sub4))
всё время выпадает ошибка:
int() argument must be a string, a bytes-like object or a number, not 'Car_Deferred_engine_birthdate165d2a59d66bcb6efd86fae72da58d9'
Если я правильно понимаю, он хочет получить циферки, а получает набор объектов.


То ли лыжи не едут, то ли я не обутый)
FishHook
Jimbo
Боюсь, что необутый

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