
Django Ninja CRUD APIViewSet组合指南多视图实例、嵌套路由与API版本管理【免费下载链接】django-ninja-crud Modular, composable API views for scalable Django Ninja projects, with built-in CRUD.项目地址: https://gitcode.com/gh_mirrors/dj/django-ninja-crudDjango Ninja CRUD 是一个为 Django Ninja 项目打造模块化、可组合 API 视图的开源库内置全套 CRUD 视图。本文以APIViewSet为主线教你快速把列表、详情、更新等视图组合进一个类、写出嵌套路由路径并管理多版本 API新手也能快速上手。一、认识 APIViewSet视图组合的容器 传统写法中每个接口都要重复配置路径、方法、请求体和响应体。APIViewSet源码见src/ninja_crud/viewsets/api_viewset.py把相关视图声明为类属性在类定义时自动完成注册并共享model、default_request_body、default_response_body等配置让一组 CRUD 接口保持同族。它有3 种注册方式按需选择class DepartmentViewSet(viewsets.APIViewSet): api api # 方式一类属性直接挂到 NinjaAPI # router router # 方式二挂到 Router便于嵌套路由 model Department ... # 方式三类定义后手动注册见 examples/views/employee_views.py EmployeeViewSet.add_views_to(router) 视图按类属性定义的顺序注册属性名即 OpenAPI 中的操作名operationId命名清晰一点文档会更易读。二、一次写齐 5 个 CRUD 视图内置视图位于src/ninja_crud/views/目录ListView、CreateView、ReadView、UpdateView、DeleteView均开箱即用且支持任意路径参数、分页、过滤和装饰器。显式声明请求/响应体class DepartmentViewSet(viewsets.APIViewSet): api api model Department list_departments views.ListView(response_bodylist[DepartmentOut]) create_department views.CreateView(request_bodyDepartmentIn, response_bodyDepartmentOut) read_department views.ReadView(response_bodyDepartmentOut) update_department views.UpdateView(request_bodyDepartmentIn, response_bodyDepartmentOut) delete_department views.DeleteView()若视图都很标准用默认体可压缩到极简完整示例见examples/views/department_views.pyclass DepartmentViewSet(viewsets.APIViewSet): api api model Department default_request_body DepartmentIn default_response_body DepartmentOut list_departments views.ListView() create_department views.CreateView() # 其余 Read / Update / Delete 同理一行一个三、嵌套路由用 path 参数组织层级端点 ️每个视图都支持自定义path配合get_queryset、init_model等回调即可在父资源下挂子资源。以部门下查员工为例源码examples/views/department_views.pylist_employees views.ListView( path/{id}/employees/, get_querysetlambda request, path_parameters: Employee.objects.filter( department_idpath_parameters.id ), response_bodylist[EmployeeOut], ) create_employee views.CreateView( path/{id}/employees/, request_bodyEmployeeIn, response_bodyEmployeeOut, init_modellambda request, path_parameters: Employee( department_idpath_parameters.id ), )路径中的{id}等参数类型会依据model自动推断无需手写 Pydantic 路径模型。若想把视图拆到独立文件用Router再挂载即可实现多级嵌套参考examples/views/employee_views.pyrouter Router() # EmployeeViewSet 通过 add_views_to(router) 注册后 api.add_router(/departments/, router) # 员工视图自然成为部门的子路由四、多视图实例API 版本管理最简方案 这是组合能力的杀手级用途同一视图类型可以在一个 ViewSet 中实例化多次指向不同路径和不同 Schema从而让 v1、v2 并存且互不干扰class EmployeeViewSet(viewsets.APIViewSet): api api model Employee read_employee_v1 views.ReadView( path/v1/employees/{id}/, response_bodyEmployeeOutV1, ) read_employee_v2 views.ReadView( path/v2/employees/{id}/, response_bodyEmployeeOutV2, # 新版本可返回更丰富字段 )同样思路也适用于同一资源、多种表现如精简版/完整版返回结构。注意属性名必须唯一它决定 OpenAPI 操作名或显式传name参数区分。五、进阶把自定义视图当作组件复用 除内置 CRUD 外可以继承APIViewsrc/ninja_crud/views/api_view.py编写任意可复用视图同步、异步皆可。项目中的examples/reusable_views.py就定义了ReusableReadView与ReusableAsyncReadViewclass ReusableReadView(APIView): def __init__(self, response_schemaNOT_SET, modelNone) - None: super().__init__(/{id}/reusable, methods[GET], response_schemaresponse_schema) self.model model def handler(self, request: HttpRequest, id: UUID) - models.Model: return self.model.objects.get(idid)之后直接放进任何 ViewSet与内置视图混用class DepartmentViewSet(viewsets.APIViewSet): api api model Department read_department views.ReadView() reusable_read_department ReusableReadView(response_schemaDepartmentOut) reusable_async_read_department ReusableAsyncReadView(response_schemaDepartmentOut)六、实战小贴士清单 ✅一个视图实例只能绑定一个 ViewSet绑定后再次分配会抛出ValueError多实例场景请创建新的视图对象。错误处理需自行配置内置视图不附带异常处理建议按 Django Ninja 规范定义exception_handler如把ObjectDoesNotExist映射为 404。同步/异步自由切换handler写成async def即自动适配异步处理。渐进式采用ViewSet 与普通 Django Ninja 装饰器端点如api.get(/stats/)可在同一 API 中混用老项目可逐步迁移。更多完整示例可参考文档 docs/guides/04-Examples.md 与examples/目录库本身通过pip install django-ninja-crud安装兼容 Django 4.2 与 Django Ninja 1.x即可开始你的第一个模块化 API 组合实践。【免费下载链接】django-ninja-crud Modular, composable API views for scalable Django Ninja projects, with built-in CRUD.项目地址: https://gitcode.com/gh_mirrors/dj/django-ninja-crud创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考