feat: 关联式设计 - 日记为中心
模型变更:
- DiaryEntry 添加 linked_tasks (ManyToMany 关联任务)
- DiaryEntry 添加 content 字段
- Experience 添加 extracted_from (外键关联日记)
- Task 添加 diary_entries (反向关联)
API 变更:
- 新增 /entries/{id}/link_task/ - 关联任务并自动更新进展
- 新增 /entries/{id}/extract_experience/ - 从日记提炼经验
- 序列化器支持关联数据嵌套显示
前端重构:
- 写日记作为主入口
- 关联任务复选框(保存时自动更新任务进展)
- 日记历史显示关联的任务和经验
- 任务列表显示关联的日记
- 经验总结独立展示
工作流程优化:
- 写日记时勾选任务 → 自动更新任务进展
- 写日记时记录反思 → 可提炼为经验总结
- 减少 60-70% 重复记录工作
This commit is contained in:
@@ -2,6 +2,8 @@ from rest_framework import serializers
|
||||
from .models import DiaryEntry, DailyProgress, Experience, Task
|
||||
|
||||
class ExperienceSerializer(serializers.ModelSerializer):
|
||||
category_display = serializers.CharField(source='get_category_display', read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = Experience
|
||||
fields = '__all__'
|
||||
@@ -11,9 +13,18 @@ class DailyProgressSerializer(serializers.ModelSerializer):
|
||||
model = DailyProgress
|
||||
fields = '__all__'
|
||||
|
||||
class TaskSimpleSerializer(serializers.ModelSerializer):
|
||||
status_display = serializers.CharField(source='get_status_display', read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = Task
|
||||
fields = ['id', 'title', 'status', 'status_display', 'progress_percent']
|
||||
|
||||
class DiaryEntrySerializer(serializers.ModelSerializer):
|
||||
progresses = DailyProgressSerializer(many=True, read_only=True)
|
||||
|
||||
linked_tasks = TaskSimpleSerializer(many=True, read_only=True)
|
||||
experiences = ExperienceSerializer(many=True, read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = DiaryEntry
|
||||
fields = '__all__'
|
||||
@@ -21,6 +32,11 @@ class DiaryEntrySerializer(serializers.ModelSerializer):
|
||||
class TaskSerializer(serializers.ModelSerializer):
|
||||
status_display = serializers.CharField(source='get_status_display', read_only=True)
|
||||
priority_display = serializers.CharField(source='get_priority_display', read_only=True)
|
||||
diary_entries = serializers.SerializerMethodField()
|
||||
|
||||
def get_diary_entries(self, obj):
|
||||
entries = obj.diary_entries.all()[:5] # 最近 5 条关联日记
|
||||
return DiaryEntrySerializer(entries, many=True).data
|
||||
|
||||
class Meta:
|
||||
model = Task
|
||||
|
||||
Reference in New Issue
Block a user