Django: загрузить ограниченный набор полей объектов, загруженных с использованием внешнего ключа - PullRequest
1 голос
/ 01 октября 2010

У меня есть следующий код, используя Django ORM

    routes =Routes.objects.filter(scheduleid=schedule.id).only('externalid')
    t_list = [(route.externalid, route.vehicle.name) for route in routes])

и это очень медленно, потому что объекты транспортных средств огромны (десятки полей, и я не могу это изменить, это исходит из устаревшей базы данных) Много времени посвящено созданию объектов Vehicle, в то время как мне нужно только поле имени этого объекта.

Есть ли более эффективный способ получить t_list? Я ищу что-то вроде only () для доступа к объектам через внешний ключ.

РЕДАКТИРОВАТЬ: Решение заключается в следующем:

routes=Routes.objects.filter(scheduleid=schedule.id).select_related("vehicle")
routes= routes.only('externalid','vehicle__name')  

Существует ли нечто подобное?

Ответы [ 2 ]

2 голосов
/ 01 октября 2010

Думаю, ты сможешь это сделать. Предупреждение: не проверено Проверено с использованием локальных моделей. Сгенерированный запрос выглядел хорошо.

routes = Routes.objects.select_related('vehicle').filter(**conditions).only(
            'externalid', 'vehicle__name')

Чтобы это работало, должно быть поле vehicle внешнего ключа, объявленное в модели Routes. Это потому, что select_related() следует только за forward взаимосвязями.

1 голос
/ 01 октября 2010

Вы можете попробовать следующее:

Routes.objects.filter(scheduleid__id=schedule.id).values('externalid', 'vehicle__name')
...