API 与视图集
API 与视图集
相关源文件
本章引用的主要源码文件:
src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.htmlsrc-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.scsssrc-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.spec.tssrc-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.tssrc-ui/src/app/data/paperless-config.tssrc-ui/src/app/data/system-status.tssrc/documents/caching.pysrc/documents/filters.pysrc/documents/serialisers.pysrc/documents/tests/test_api_app_config.pysrc/documents/tests/test_api_bulk_download.pysrc/documents/tests/test_api_custom_fields.pysrc/documents/tests/test_api_document_versions.pysrc/documents/tests/test_api_documents.pysrc/documents/tests/test_api_filter_by_custom_fields.pysrc/documents/tests/test_api_permissions.pysrc/documents/tests/test_api_schema.pysrc/documents/tests/test_api_status.pysrc/documents/tests/test_views.pysrc/documents/views.pysrc/paperless/config.pysrc/paperless/migrations/0005_applicationconfiguration_ai_enabled_and_more.pysrc/paperless/models.pysrc/paperless/serialisers.pysrc/paperless/urls.pysrc/paperless/validators.pysrc/paperless/views.py
本文档记录了 Paperless-ngx 中的 REST API 架构,详细说明了构成后端通信层核心的 Django REST Framework(DRF)ViewSets、序列化器和路由逻辑。
API 架构总览
Paperless-ngx 的 API 基于 Django REST Framework 构建,遵循标准的 RESTful 架构模式。主要组件包括 ViewSets、序列化器、过滤器和权限类。
请求数据流
下图展示了请求如何从自然语言空间(用户意图)映射到代码实体空间。
标题:请求到代码实体的映射
来源:src/paperless/urls.py:70-91, src/documents/views.py:352-400, src/documents/serialisers.py:881-916
URL 路由与注册
API 端点在 src/paperless/urls.py 中使用 DRF 的 DefaultRouter 进行注册。这会自动为已注册的 ViewSets 生成标准的 RESTful 路由(GET、POST、PUT、PATCH、DELETE)。
| 端点 | ViewSet / 视图类 | 描述 |
|---|---|---|
/api/documents/ | UnifiedSearchViewSet | 主要文档列表与搜索 |
/api/correspondents/ | CorrespondentViewSet | 文档通信方的增删改查 |
/api/tags/ | TagViewSet | 文档标签的增删改查 |
/api/document_types/ | DocumentTypeViewSet | 文档类型的增删改查 |
/api/storage_paths/ | StoragePathViewSet | 存储路径模板的增删改查 |
/api/custom_fields/ | CustomFieldViewSet | 动态自定义字段的增删改查 |
/api/tasks/ | TasksViewSet | 监控后台 Celery 任务 |
/api/ui_settings/ | UiSettingsView | 获取/设置用户特定的 UI 偏好 |
/api/config/ | ApplicationConfigurationViewSet | 全局系统配置 |
来源:src/paperless/urls.py:70-90, src/paperless/urls.py:145-154
核心 ViewSet 实现
UnifiedSearchViewSet
UnifiedSearchViewSet 是文档交互的主要入口点。它继承自 DocumentViewSet,并与 Tantivy 搜索后端集成。
- 实现:继承自
PassUserMixin、RetrieveModelMixin、UpdateModelMixin、DestroyModelMixin、ListModelMixin和GenericViewSetsrc/documents/views.py:352-363。 - 过滤:使用
DocumentFilterSet进行数据库级别的过滤,使用ObjectOwnedOrGrantedPermissionsFilter进行安全控制src/documents/views.py:372-377。 - 排序:通过
DocumentsOrderingFilter支持自定义排序,包括按自定义字段排序src/documents/views.py:376-390。
元数据视图集
CorrespondentViewSet、TagViewSet 和 DocumentTypeViewSet 负责管理文档元数据。它们使用 PermissionsAwareDocumentCountMixin 来返回当前用户有权查看的每个关联项的文档计数 src/documents/views.py:247-271。
标题:ViewSet 层次结构与 Mixins
来源:src/documents/views.py:231-245, src/documents/views.py:247-271, src/documents/views.py:352-363
专用视图
PostDocumentView
处理 /api/documents/post_document/ 的 POST 请求,用于文档上传。
- 功能:校验上传的文件,创建
ConsumableDocument数据模型,并触发异步消费管线src/documents/views.py:1401-1504。 - 响应:返回一个 Celery 任务 ID,前端使用该 ID 跟踪进度
src/documents/views.py:1497。
CustomFieldViewSet
管理动态元数据字段。
- 数据类型:支持
string(字符串)、url(URL)、date(日期)、integer(整数)、boolean(布尔值)、float(浮点数)、monetary(货币)和documentlink(文档链接)src/documents/tests/test_api_custom_fields.py:37-46。 - 校验:包含针对
select(选择)字段的特殊逻辑,确保选项 ID 唯一并清理未使用的选项src/documents/tests/test_api_custom_fields.py:163-218。
批量操作视图
- BulkEditView:处理多个文档。支持的操作包括
set_correspondent(设置通信方)、modify_tags(修改标签)、delete(删除)和merge(合并)src/documents/views.py:1507-1600。 - BulkDownloadView:生成所选文档的 ZIP 压缩包。支持的策略包括
OriginalsOnlyStrategy(仅原始文件)、ArchiveOnlyStrategy(仅归档文件)和OriginalAndArchiveStrategy(原始与归档文件)src/documents/views.py:109-111,src/documents/views.py:1700-1755。
UiSettingsView
为 UiSettings 模型提供 GET 和 POST 接口。这允许前端持久化用户偏好,如主题、侧边栏状态和已保存的视图配置 src/documents/views.py:1130-1180。
来源:src/documents/views.py:1130-1180, src/documents/views.py:1401-1504, src/documents/views.py:1507-1600, src/documents/views.py:1700-1755
序列化器与数据转换
Paperless-ngx 使用复杂的序列化器来处理嵌套关系和权限。
- DynamicFieldsModelSerializer:一个基类,允许 API 仅返回通过
?fields=查询参数请求的字段子集,从而优化响应大小src/documents/serialisers.py:103-122。 - DocumentSerializer:转换
Document模型。它包含计算num_notes(笔记数)、处理custom_fields(自定义字段)实例以及基于对象级权限提供user_can_change(用户可更改)标志的逻辑src/documents/serialisers.py:881-916。 - MatchingModelSerializer:为通信方和标签使用的
match(匹配)和matching_algorithm(匹配算法)字段提供校验src/documents/serialisers.py:124-168。
来源:src/documents/serialisers.py:103-122, src/documents/serialisers.py:124-168, src/documents/serialisers.py:881-916
过滤与权限
ObjectOwnedOrGrantedPermissionsFilter
此过滤器应用于大多数 ViewSets,以确保用户只能看到自己拥有或通过 django-guardian 被明确授予访问权限的数据 src/documents/filters.py:40, src/documents/views.py:375。
DocumentFilterSet
一个全面的 FilterSet,用于 Document 模型,支持:
- 属性过滤:
created(创建时间)、added(添加时间)、title(标题)、content(内容)。 - 逻辑过滤:
tags__id__all(标签 ID 全部包含)、tags__id__none(标签 ID 均不包含)src/documents/filters.py:131-157。 - 自定义字段过滤:使用
CustomFieldQueryParser允许对动态元数据进行复杂查询src/documents/filters.py:58。
来源:src/documents/filters.py:58-157, src/documents/views.py:372-377