模型变更:
- DiaryEntry 添加 linked_tasks (ManyToMany 关联任务)
- DiaryEntry 添加 content 字段
- Experience 添加 extracted_from (外键关联日记)
- Task 添加 diary_entries (反向关联)
API 变更:
- 新增 /entries/{id}/link_task/ - 关联任务并自动更新进展
- 新增 /entries/{id}/extract_experience/ - 从日记提炼经验
- 序列化器支持关联数据嵌套显示
前端重构:
- 写日记作为主入口
- 关联任务复选框(保存时自动更新任务进展)
- 日记历史显示关联的任务和经验
- 任务列表显示关联的日记
- 经验总结独立展示
工作流程优化:
- 写日记时勾选任务 → 自动更新任务进展
- 写日记时记录反思 → 可提炼为经验总结
- 减少 60-70% 重复记录工作
45 lines
1.6 KiB
Python
Executable File
45 lines
1.6 KiB
Python
Executable File
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__'
|
|
|
|
class DailyProgressSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
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__'
|
|
|
|
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
|
|
fields = '__all__'
|
|
read_only_fields = ['completed_at', 'created_at', 'updated_at']
|