Как я выбираю из нескольких таблиц в одном запросе с 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

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

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

Действительно ли это возможно с Django QuerySet? В противном случае есть ли способ, которым я могу работать вокруг для решения этого (без сырых данных sql)? Или это поведение нужно проигнорировать, кэшировать и считать "оптимизированное"?

11
задан tdolsen 11 March 2010 в 14:17
поделиться

2 ответа

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

Employee.objects.select_related()
24
ответ дан 3 December 2019 в 01:29
поделиться

Думаю, вы ищете метод select_related вашего набора запросов. См. документ

select_related ()

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

8
ответ дан 3 December 2019 в 01:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: