feat(djapi): 新增日报查询 API(news/reports + news/events)及文档

- api/report/ 包:query(连库+SQL)/ views(2 视图)/ serializers(OpenAPI)/ tests(17 单测)
- urls.py 注册 news/reports/、news/events/;settings.py SPECTACULAR 加「日报」tag
- .env.example 补 NEWS_DB_* 占位配置;README/continuation.md 更新
- docs/news_report_api.md 使用手册;CLAUDE*.md 修正 CLI 路径为 finance/ 前缀
This commit is contained in:
2026-08-05 20:51:42 +08:00
parent 22ce3a6aea
commit 6ec198687c
17 changed files with 1275 additions and 21 deletions
+50
View File
@@ -0,0 +1,50 @@
"""日报查询 API 的 OpenAPI 文档 serializer(只读,不用于反序列化)。"""
from rest_framework import serializers
class EventSerializer(serializers.Serializer):
"""日报事件明细(news_event 一行)"""
id = serializers.IntegerField()
section = serializers.CharField()
rank = serializers.IntegerField()
importance = serializers.IntegerField(allow_null=True)
event_type = serializers.CharField(allow_null=True)
title = serializers.CharField()
summary = serializers.CharField(allow_null=True)
sentiment = serializers.CharField(allow_null=True)
source = serializers.CharField(allow_null=True)
url = serializers.CharField(allow_null=True)
class ReportListSerializer(serializers.Serializer):
"""日报列表项(news_report 主表字段)"""
id = serializers.IntegerField()
report_date = serializers.CharField()
report_type = serializers.CharField()
file_name = serializers.CharField()
generated_at = serializers.CharField()
ai_summary = serializers.CharField(allow_null=True)
stats = serializers.JSONField(allow_null=True)
created_at = serializers.CharField()
class ReportDetailSerializer(ReportListSerializer):
"""日报详情(主表字段 + 事件列表)"""
events = EventSerializer(many=True)
class ImportantEventSerializer(serializers.Serializer):
"""跨日报重要事件聚合(news_event JOIN news_report"""
report_date = serializers.CharField()
report_type = serializers.CharField()
id = serializers.IntegerField()
section = serializers.CharField()
rank = serializers.IntegerField()
importance = serializers.IntegerField(allow_null=True)
event_type = serializers.CharField(allow_null=True)
title = serializers.CharField()
summary = serializers.CharField(allow_null=True)
sentiment = serializers.CharField(allow_null=True)
source = serializers.CharField(allow_null=True)
url = serializers.CharField(allow_null=True)