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,15 +2,19 @@ from django.db import models
|
||||
from django.utils import timezone
|
||||
|
||||
class DiaryEntry(models.Model):
|
||||
"""日记条目"""
|
||||
"""日记条目 - 作为所有记录的主入口"""
|
||||
date = models.DateField('日期', unique=True)
|
||||
title = models.CharField('标题', max_length=200, default='每日日记')
|
||||
content = models.TextField('日记内容', blank=True, default='')
|
||||
completed_tasks = models.TextField('完成的任务', blank=True, default='')
|
||||
learned = models.TextField('学到的东西', blank=True, default='')
|
||||
problems = models.TextField('遇到的问题和解决方案', blank=True, default='')
|
||||
reflections = models.TextField('想法和反思', blank=True, default='')
|
||||
improvements = models.TextField('进步点', blank=True, default='')
|
||||
plans = models.TextField('明日计划', blank=True, default='')
|
||||
|
||||
# 关联字段(使用字符串引用避免循环导入)
|
||||
linked_tasks = models.ManyToManyField('Task', blank=True, related_name='diary_entries', verbose_name='关联任务')
|
||||
created_at = models.DateTimeField('创建时间', auto_now_add=True)
|
||||
updated_at = models.DateTimeField('更新时间', auto_now=True)
|
||||
|
||||
@@ -21,6 +25,25 @@ class DiaryEntry(models.Model):
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.date} - {self.title}"
|
||||
|
||||
def link_task(self, task, progress_percent=None, notes=''):
|
||||
"""关联任务并更新进展"""
|
||||
self.linked_tasks.add(task)
|
||||
if progress_percent is not None:
|
||||
task.update_progress(progress_percent, f"日记 {self.date}: {notes}")
|
||||
self.save()
|
||||
|
||||
def extract_experience(self, title, category, problem, solution, lesson_learned=''):
|
||||
"""从日记提炼经验"""
|
||||
exp = Experience.objects.create(
|
||||
title=title,
|
||||
category=category,
|
||||
problem=problem,
|
||||
solution=solution,
|
||||
lesson_learned=lesson_learned,
|
||||
date=self.date
|
||||
)
|
||||
return exp
|
||||
|
||||
|
||||
class Experience(models.Model):
|
||||
@@ -37,7 +60,11 @@ class Experience(models.Model):
|
||||
problem = models.TextField('问题描述')
|
||||
solution = models.TextField('解决方案')
|
||||
lesson_learned = models.TextField('经验教训', blank=True, default='')
|
||||
date = models.DateField('日期', auto_now_add=True)
|
||||
date = models.DateField('日期')
|
||||
|
||||
# 关联到日记(可选,经验可以独立创建)
|
||||
extracted_from = models.ForeignKey(DiaryEntry, on_delete=models.SET_NULL, null=True, blank=True,
|
||||
related_name='experiences', verbose_name='提取自日记')
|
||||
created_at = models.DateTimeField('创建时间', auto_now_add=True)
|
||||
|
||||
class Meta:
|
||||
|
||||
Reference in New Issue
Block a user