«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Когда использовать select_based или prefetch_based в Django ORM?

Когда использовать select_based или prefetch_based в Django ORM?

Опубликовано 14 ноября 2024 г.
Просматривать:850

When to Use Django ORM\'s select_related vs. prefetch_related?

Различие между методами select_related и prefetch_related в Django ORM

В 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.

Заявление о выпуске Эта статья перепечатана по адресу: 1729672608. В случае каких-либо нарушений, пожалуйста, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3