У меня есть две таблицы, одна "Компания" и один "Сотрудник":
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)? Или это поведение нужно проигнорировать, кэшировать и считать "оптимизированное"?
Использование select_related () предварительно подставит соответствующие атрибуты:
Employee.objects.select_related()
Думаю, вы ищете метод select_related вашего набора запросов. См. документ
select_related ()
Возвращает QuerySet, который автоматически "отслеживает" отношения внешнего ключа , выбирая этот {{1} } дополнительные данные связанного объекта, когда он выполняет свой запрос. Это усилитель производительности, который приводит к (иногда намного) более крупным запросам, но означает, что более позднее использование отношений внешнего ключа не потребует базы данных {{ 1}} запросы