В Django ORM методы select_related и prefetch_lated служат разным целям для управления связями в запросах к базе данных.
select_based
Джанго Метод select_related извлекает связанные данные модели во время запроса к базе данных, выполняя соединения SQL. Он эффективно извлекает выбранные поля связанных моделей, сводя к минимуму необходимость последующих запросов. Этот подход особенно подходит для отношений, включающих соединения по внешнему ключу или OneToOneField.
prefetch_related
В отличие от select_based, prefetch_lated не выполняет SQL-соединения. Вместо этого он выполняет отдельные запросы для получения связанных моделей. Затем данные «объединяются» в Python. Этот метод полезен для отношений, включающих ManyToManyFields, или обратных соединений по внешнему ключу.
Пример
Рассмотрим следующую настройку модели:
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
author = models.ForeignKey(Author)
Чтобы получить имя автора и связанные с ним книги, используйте select_related:
author = Author.objects.select_related('book_set').get(pk=1)
for book in author.book_set.all():
print(book.title)
Чтобы получить имя автора и связанные с ним книги, используя prefetch_related:
authors = Author.objects.prefetch_related('book_set').all()
for author in authors:
for book in author.book_set.all():
print(book.title)
Хотя оба метода извлекают связанные данные, select_lated оптимален для отношений одного объекта с ограниченным количеством избыточных столбцов. Напротив, prefetch_related предпочтителен для отношений «многие ко многим» или для разреженных отношений обратного внешнего ключа, чтобы минимизировать взаимодействие с базой данных. Однако это может привести к дублированию объектов в представлении данных Python.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3