Как правильно изолировать бизнес-логику в 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)