• Как избавиться от N+1 зависимости при сериализации данных в django rest framework?

    @deliro
    prefetch_related('имя менеджера')
    Выполняет дополнительный (но один) запрос, чтобы закэшировать Many-to-Many элементы или One-to-Many, если элементы нашего QuerySet'а в отношении O2M являются One.

    select_related('имя fk поля')
    Выполняет JOIN таблицы, на которую ссылается ForeignKey (fk)

    Например:
    class SomeModel(Model):
        items = ManyToManyField(Item)
    
    # закэширует все Item каждого SomeModel двумя запросами
    SomeModel.objects.all().prefetch_related('items')  
    
    # или
    
    class SomeModel(Model):
        pass
    
    class Item(Model):
        some_model = ForeignKey(SomeModel, related_name='itemz')  # Обрати внимание на related_name
    
    qs = SomeModel.objects.all().prefetch_related('itemz')  # Опять 2 запроса
    qs[0].itemz.all()  # Не создаст запрос в БД
    # Если же ты хочешь одним запросом получить
    # SomeModel'ы Item'ов, то:
    qs = Item.objects.filter(...).select_related('some_model')
    qs[0].some_model  # Не создаст запрос в БД
    Ответ написан
    Комментировать