В чем отличие related_name от prefetch_related?

Рейтинг: 0Ответов: 1Опубликовано: 18.03.2023

Я так понял, что при добавлении в модели связанных объектов через ForeignKey и ManyToManyField при помощи related_name можно обращаться из связанных объектов к тем, от которых эта связь была создана.

То есть, если допустим есть модель Book и модель Author, ссылка на Author это ForeignKey в модели Book, то тогда при установке у поля ForeignKey значение related_name='books' через Author.books можно будет посмотреть все книги, которые написал автор.

Немного непонятно, а для чего тогда нужен prefetch_related?

Мне всегда казалось, что именно prefetch_related выполняет эту задачу (находит все связанные объекты с текущим обратным соотношением), потому что такого функционала как related_name просто нет, но раз он есть, то для чего тогда prefetch_related?

Ответы

▲ 1Принят

Да, вы правильно понимаете, что related_name используется для установления обратной связи между двумя моделями и позволяет обращаться к связанным объектам через объекты, на которые ссылаются эти объекты.

Но prefetch_related и related_name выполняют разные задачи.

prefetch_related используется для улучшения производительности запросов к базе данных, связанных с объектами модели, которые могут быть загружены заранее в память. Он выполняет предварительную загрузку связанных объектов, которые могут быть запрошены в будущем, и сохраняет их в кэше, чтобы избежать дополнительных запросов к базе данных при обращении к связанным объектам.

Когда вы используете related_name для установления обратной связи, это просто определяет имя, которое вы можете использовать для обращения к связанным объектам из других моделей. Но без prefetch_related каждый раз при обращении к связанным объектам будет выполняться отдельный запрос к базе данных.

Надеюсь стало яснее ^_^