не гнется и наоборот • Arch Guide — делим ответственность по слоям • FieldTracker — знаем, что поменялось у модели • Обогащаем контекст транзакции для CDC
не гнется и наоборот • Arch Guide — делим ответственность по слоям • FieldTracker — знаем, что поменялось у модели • Обогащаем контекст транзакции для CDC • PGView — когда аннотаций не хватает
не гнется и наоборот • Arch Guide — делим ответственность по слоям • FieldTracker — знаем, что поменялось у модели • Обогащаем контекст транзакции для CDC • PGView — когда аннотаций не хватает • STORAGES — подключаем несколько хранилищ в стиле Django
разного • Форматы (common:1, common:2) зашли мобильной разработке • Ресурсы (ролевое версионирование) зашли не очень • К oneOf в схеме готовы немногие (тулинг, валидаторы, кодогенераторы)
разного • Форматы (common:1, common:2) зашли мобильной разработке • Ресурсы (ролевое версионирование) зашли не очень • К oneOf в схеме готовы немногие (тулинг, валидаторы, кодогенераторы) • Pydantic-сериализаторы лаконичны и удобны
разного • Форматы (common:1, common:2) зашли мобильной разработке • Ресурсы (ролевое версионирование) зашли не очень • К oneOf в схеме готовы немногие (тулинг, валидаторы, кодогенераторы) • Pydantic-сериализаторы лаконичны и удобны • Есть претензии к ModelViewSet миксинам
Можно достаточно быстро начать … • … быстро вырасти • … и легко накопить техдолг Владимир Филонов. Тени прошлого: разбираемся, как бороться с legacy https://www.youtube.com/watch?v=1-Dis1hX7r0
common patterns for Django. While it appears to work for him, it makes for a harder-to-maintain project in that any new developer on the project has to learn a new paradigm. The charm of Django is heavily based on convention over configuration, and his design explicitly breaks it.”
Не можем отдать одинаковый ответ на list/retrieve и create/update class AuthorViewSet(ModelViewSet): queryset = Author.objects.annotate(books_count=Count(‘books’)) serializer_class = AuthorWithCountSerializer def get_serializer_class(self): …
базу • И это никак нельзя отразить в схеме API class BookCreateSerializer(ModelSerializer): class Meta: model = Book fields = [‘title’, ‘author’] author = SlugRelatedField( slug_field=’uuid’, queryset = Author.objects.all() )
представления • Model отвечают за описание схемы данных • Запрещены вызовы save() модели, мутирование моделей и данных в БД за пределами слоя Interactor’ов
• Facade — реализация кейса, комплексная логика • Facade — точка входа для слоя представления • При усложнении Interactor или Selector может стать Facade’ом • При усложнении из Facade должны выделяться Interactor’ы и Selector’ы
в формат для передачи, никаких агрегаций или трансформаций данных, “бизнес” валидаций • Каждый action — это по сути разбор запроса request serializer’ом, вызов facade и сериализация его ответа response serializer’ом • Нужны новые миксины для ViewSet
◦ бизнес-логика сервиса отвечает за проверки целостности и консистентности ◦ В API только операции над сущностями ◦ никаких “прямых” правок базы через админку • Логику реализуют отдельные сервисы, в частности BFF ◦ бизнес-логика сервиса реализует бизнес кейсы