Django автоматически извлекает родительский объект, когда извлеченный дочерний объект ссылается на этот объект? - PullRequest
0 голосов
/ 13 февраля 2020

В среде Spring, когда объект A имеет отношение ManyToOne к объекту B:

public class objectA{

private Long id;

@ManyToOne
private objectB objectB;

}

Тогда этот объект B выбирается только тогда, когда метод get для объекта B вызывается где-то в коде. В этом случае делается дополнительный запрос SQL для выборки объекта B этого конкретного экземпляра objectA. Вы можете изменить это поведение, изменив стратегию выборки на EAGER, в этом случае objectB также выбирается во время первоначального запроса для выборки объекта A.

Мой вопрос: какой стиль выборки по умолчанию использует Django? Всегда ли Django выбирает какие-либо родительские объекты или дочерние объекты, на которые есть ссылки? Или это зависит от отношения?

Спасибо

1 Ответ

0 голосов
/ 13 февраля 2020

Множество к одному в Django определяется полем ForeignKey

По умолчанию он выбирает его лениво, т. Е. Только при доступе к этому полю.

Эквивалент EAGER равен .select_related('objectB'). Документы здесь


select_related ()

Возвращает QuerySet, который будет «следовать» отношениям внешнего ключа, выбирая дополнительные данные связанного объекта при выполнении своего запроса , Это повышение производительности, которое приводит к одному более сложному запросу, но означает, что дальнейшее использование отношений внешнего ключа не потребует запросов к базе данных.

Следующие примеры иллюстрируют разницу между обычным поиском и поиском select_related (). Вот стандартный поиск:

# Hits the database.
e = Entry.objects.get(id=5)

# Hits the database again to get the related Blog object.
b = e.blog

А вот поиск select_related:

# Hits the database.
e = Entry.objects.select_related('blog').get(id=5)

# Doesn't hit the database, because e.blog has been prepopulated
# in the previous query.
b = e.blog
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...