Задать вопрос
meteozond
@meteozond

Как избавиться от повторяющихся join'ов при пересекающихся ForeignKey в Django?

Заметил такую неприятную штуку. Допустим есть модель которая связана двумя другими имеющими одинаковый ForeignKey.



class File(models.Model):<br/>
&nbsp;&nbsp;&nbsp;&nbsp;#some stuff<br/>
&nbsp;&nbsp;&nbsp;&nbsp;pass<br/>
 <br/>
class ServerFile(models.Model):<br/>
&nbsp;&nbsp;&nbsp;&nbsp;<b>file = models.ForeignKey('File')</b><br/>
&nbsp;&nbsp;&nbsp;&nbsp;#some stuff<br/>
 <br/>
class UserFile(models.Model):<br/>
&nbsp;&nbsp;&nbsp;&nbsp;<b>file = models.ForeignKey('File')</b><br/>
&nbsp;&nbsp;&nbsp;&nbsp;#some stuff<br/>
<br/>
class Link(models.Model): <br/>
&nbsp;&nbsp;&nbsp;&nbsp;user_file = models.ForeignKey('UserFile')<br/>
&nbsp;&nbsp;&nbsp;&nbsp;server_file = models.ForeignKey('ServerFile')<br/>
&nbsp;&nbsp;&nbsp;&nbsp;#some stuff




Соответственно при включенном list_select_related, получаем дополнительный join на File



SELECT

  `fff_link`.`id`,

  `fff_link`.`user_file_id`,

  `fff_link`.`server_file_id`,

  `fff_userfile`.`id`,

  `fff_userfile`.`file_id`,

  `fff_file`.`id`,

  `fff_serverfile`.`id`,

  `fff_serverfile`.`file_id`,

  T5.`id`

FROM `fff_link`

  INNER JOIN `fff_userfile`

    ON (`fff_link`.`user_file_id` = `fff_userfile`.`id`)

  INNER JOIN `fff_file`

    ON (`fff_userfile`.`file_id` = `fff_file`.`id`)


  INNER JOIN `fff_serverfile`

    ON (`fff_link`.`server_file_id` = `fff_serverfile`.`id`)

  INNER JOIN `fff_file` T5

    ON (`fff_serverfile`.`file_id` = T5.`id`)




Может кто сталкивался? Как лечить?

Отказ от пересечения — не вариант, естественно
  • Вопрос задан
  • 2792 просмотра
Подписаться 2 Оценить 3 комментария
Пригласить эксперта
Ответы на вопрос 1
FloppyFormator
@FloppyFormator
А зачем лечить? В данном случае JOIN абсолютно адекватный.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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