Как правильно изолировать бизнес-логику в Django

Допустим, есть какая-то вьюха, в которой должно быть много логики. Чтобы не писать ее в самом классе ProductView, я хотел бы создать служебный класс, например, ProductService и вынести всю логику в него.

class ProductView(View):
    def __init__(self):
        super().__init__()
        self._product_service = ProductService()

В реализации логики мне будет постоянно нужен объект текущего запроса. Поэтому, было бы хорошо передать его в конструктор класса ProductService и использовать внутри как атрибут класса.

Проблема в том, что на момент создания ProductService в конструкторе вьюхи, ProductView еще не имеет объекта self.request. Поэтому приходится передавать его потом при вызове каждого метода сервиса. Можно ли как-то это обойти и передать запрос в класс сервиса только один раз?


Ответы (1 шт):

Автор решения: Константин Комиссаров

Можно сделать это в методе setup:

class ProductView(View):
    def __init__(self):
        super().__init__()
        self._product_service = None

    def setup(self, request, *args, **kwargs):
        super().setup()
        self._product_service = ProductService(request)
→ Ссылка