Django prefetch_related с обратным поиском внешнего ключа - PullRequest
0 голосов
/ 05 мая 2018

С учетом этих моделей в Django документах :

class Topping(models.Model):
    name = models.CharField(max_length=30)

class Pizza(models.Model):
    name = models.CharField(max_length=50)
    toppings = models.ManyToManyField(Topping)

Я хочу получать начинки и делать вещи с их pizza_set:

toppings = Topping.objects.all()

for topping in toppings:
   pizzas_with_this_topping = topping.pizza_set()
   # do stuff with pizzas_with_this_topping

Как я могу использовать prefetch_related (или другую технику), чтобы получить все данные о пицце, не обращаясь к базе данных по каждой пицце в каждом топпинге?

1 Ответ

0 голосов
/ 06 мая 2018

Предварительно извлекайте их так:

toppings = Topping.objects.prefetch_related('pizza_set')

тогда следующее не попадет в базу данных:

for topping in toppings:
    pizzas_with_toppings = topping.pizza_set.all()

Я хотел бы добавить, что Django изо всех сил старается быть простым в использовании для простых вещей (и, без сомнения, Django делает это великолепно), но это, очевидно, заставляет Django делать много неявных вещей, которые не сразу очевидны из код приложения, поэтому, когда вы делаете что-то продвинутое, вы должны ожидать неожиданного, прочитайте документы Django, которые разъясняют всю магию, и используйте такие инструменты, как Django Debug Toolbar и т. д., чтобы убедиться, что все работает так, как вы ожидаете.

...