Ого, честно, не подумал бы даже делать такое на конвертерах :)
Если приходится для роутинга лезть в БД, то тут как ни крути — придется лезть в БД. Кажется, что в обработчике будет меньше запросов (если сам объект знает все что нужно, чтобы выбрать нужный роут).
Избыточные запросы действительно появляются, как раз комментарием выше это обсуждали. И это действительно серьезная проблема.
А размывание логики не стоит допускать — задача конвертера только дать ответ: могу сконвертировать или нет = маршрут не подходит, сайд эффекты привносить в конвертер точно не стоит :)
Я к конвертерам скорее отношусь как к сериализаторам из DRF, только которые принудительно вызываются до обработчика, а не внутри.
Что же касается логики получения самого отчета — действительно, возможно нужны будут связанные модели и сам User не нужен вовсе, а возможно улетит запрос в сторонний сервис и нужен будет некий токен из модели User. Тут уже зависит от задач — если обработчик использует user_id — значит его и получаем, если же использует User, то хотелось бы получить User на вход.
А вот насчет отсутствия request согласен. Сделать запрос в БД, чтобы убедиться в валидности маршрута, а потом узнать что нет прав на исполнение этого обработчика и можно было бы не делать запрос в БД — грустный сценарий. Это будет бить по производительности.
При этом разрешать вопрос прав нужно не в конвертере или URLResolver, это не их забота, а частично до (вот этого слоя не хватает, простые проверки, типа маршрут только для админа) и частично после (в обработчике).
На практике же, действительно, пока из самописных конвертеров я использую только конвертер для даты :)
Если приходится для роутинга лезть в БД, то тут как ни крути — придется лезть в БД. Кажется, что в обработчике будет меньше запросов (если сам объект знает все что нужно, чтобы выбрать нужный роут).
А размывание логики не стоит допускать — задача конвертера только дать ответ: могу сконвертировать или нет = маршрут не подходит, сайд эффекты привносить в конвертер точно не стоит :)
Я к конвертерам скорее отношусь как к сериализаторам из DRF, только которые принудительно вызываются до обработчика, а не внутри.
.all()кеширует результаты при исполнении, а как раз в приведенном конвертере исполняется не.all(), а.get(), поэтому проблем не возникнет.При этом получаем возможность в декларативном стиле добавлять фильтрации:
Если же захочется в конвертере использовать
.all(), то тогда в нем же и стоит позаботиться об актуальности данных :)Но пока не могу представить себе конвертер, в котором это потребовалось бы.
Про видовые классы и
re_pathне понял. Финальная view-функция выглядит так:CBV выглядел бы так:
Можно пояснение, что имелось ввиду?
Что же касается логики получения самого отчета — действительно, возможно нужны будут связанные модели и сам
Userне нужен вовсе, а возможно улетит запрос в сторонний сервис и нужен будет некий токен из моделиUser. Тут уже зависит от задач — если обработчик используетuser_id— значит его и получаем, если же используетUser, то хотелось бы получитьUserна вход.А вот насчет отсутствия
requestсогласен. Сделать запрос в БД, чтобы убедиться в валидности маршрута, а потом узнать что нет прав на исполнение этого обработчика и можно было бы не делать запрос в БД — грустный сценарий. Это будет бить по производительности.При этом разрешать вопрос прав нужно не в конвертере или
URLResolver, это не их забота, а частично до (вот этого слоя не хватает, простые проверки, типа маршрут только для админа) и частично после (в обработчике).На практике же, действительно, пока из самописных конвертеров я использую только конвертер для даты :)
Исправил ;)