Как выбрать из нескольких таблиц в одном запросе с помощью Django?

у меня есть две таблицы, одна "компания" и один "сотрудник":

class Company(models.Model):
    name = models.CharField(max_length=60)

class Employee(models.Model):
    name = models.CharField(max_length=60)
    company = models.ForeignField(Company)

и я хочу перечислить каждого сотрудника в таблице, с компанией рядом с ним. Что достаточно просто, позвонив employees = Employee.objects.all() и в цикле шаблона через него и называя {{employee.company.name}}.

проблема с этим решением заключается в том, что будет создан новый запрос для каждого элемента в цикле. Поэтому для каждого сотрудника будет один запрос в компанию, выглядящую примерно так это:

SELECT `company`.`id`, `company`.`name`
FROM `company`
WHERE `company`.`id` = 1 # This will of course be the employee.company_id

вместо этого я хочу сделать это соединение изначально в том же запросе, что и сотрудники. Что-то вроде этого:--6-->

SELECT `employee`.`name` AS `name`,
       `company`.`name` AS `company_name`
FROM `employee` INNER JOIN `company` ON `employee`.`company_id` = `company`.`id`

возможно ли это с помощью запроса Django? Если нет, есть ли способ обойти это(без raw sql)? Или это поведение следует игнорировать, кэшировать и считать "оптимизированным"?

3 ответов


используя select_related() предварительно заполнит соответствующие атрибуты:

Employee.objects.select_related()

Я думаю, что вы ищете метод select_related вашего queryset. См.док

select_related ()

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


Это старый вопрос, Позвольте мне дать новый ответ.

на самом деле, вы можете сделать это:

employees = Employee.objects.all().values('id','name','company__name')

затем, Django будет автоматически искать класс компании и найти название компании для вас.

на странице шаблона используйте {{employee.компания__имя}}, то он будет отображать правильно название компании.