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