Сведения о вопросе

CPdeveloper

12:57, 24th August, 2020

Теги

Django   ORM    

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

Просмотров: 363   Ответов: 1

Заметил такую неприятную штуку. Допустим есть модель которая связана двумя другими имеющими одинаковый 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`)




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

Отказ от пересечения — не вариант, естественно



  Сведения об ответе

COOL

21:32, 12th August, 2020

А зачем лечить? В данном случае JOIN абсолютно адекватный.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться