From ebf196686f555593b1247645561ff87266db98ab Mon Sep 17 00:00:00 2001 From: yuliang_guo Date: Sat, 31 Jan 2026 18:35:17 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB=E5=8A=A1API?= =?UTF-8?q?=E6=9E=9A=E4=B8=BE=E5=80=BC=E8=AE=BF=E9=97=AE=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 使用 hasattr 检查是否为枚举类型,兼容字符串和枚举 - 移除 get_tasks 中多余的 get_task_detail 调用,使用已加载的关联数据 --- backend/app/api/v1/tasks.py | 60 +++++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 23 deletions(-) diff --git a/backend/app/api/v1/tasks.py b/backend/app/api/v1/tasks.py index f5484d9..208f5c3 100644 --- a/backend/app/api/v1/tasks.py +++ b/backend/app/api/v1/tasks.py @@ -43,13 +43,20 @@ async def create_task( # 构建响应 courses = [link.course.name for link in task.course_links] + # 安全获取枚举值(兼容字符串和枚举类型) + priority_val = task.priority.value if hasattr(task.priority, 'value') else task.priority + status_val = task.status.value if hasattr(task.status, 'value') else task.status + completed_count = sum( + 1 for a in task.assignments + if (a.status.value if hasattr(a.status, 'value') else a.status) == "completed" + ) return ResponseModel( data=TaskResponse( id=task.id, title=task.title, description=task.description, - priority=task.priority.value, - status=task.status.value, + priority=priority_val, + status=status_val, creator_id=task.creator_id, deadline=task.deadline, requirements=task.requirements, @@ -58,7 +65,7 @@ async def create_task( updated_at=task.updated_at, courses=courses, assigned_count=len(task.assignments), - completed_count=sum(1 for a in task.assignments if a.status.value == "completed") + completed_count=completed_count ) ) @@ -77,26 +84,33 @@ async def get_tasks( # 构建响应 items = [] for task in tasks: - # 加载关联数据 - task_detail = await task_service.get_task_detail(db, task.id) - if task_detail: - courses = [link.course.name for link in task_detail.course_links] - items.append(TaskResponse( - id=task.id, - title=task.title, - description=task.description, - priority=task.priority.value, - status=task.status.value, - creator_id=task.creator_id, - deadline=task.deadline, - requirements=task.requirements, - progress=task.progress, - created_at=task.created_at, - updated_at=task.updated_at, - courses=courses, - assigned_count=len(task_detail.assignments), - completed_count=sum(1 for a in task_detail.assignments if a.status.value == "completed") - )) + # 安全获取枚举值 + priority_val = task.priority.value if hasattr(task.priority, 'value') else task.priority + status_val = task.status.value if hasattr(task.status, 'value') else task.status + + # 使用已加载的关联数据(通过 selectinload) + courses = [link.course.name for link in task.course_links] if task.course_links else [] + completed_count = sum( + 1 for a in task.assignments + if (a.status.value if hasattr(a.status, 'value') else a.status) == "completed" + ) if task.assignments else 0 + + items.append(TaskResponse( + id=task.id, + title=task.title, + description=task.description, + priority=priority_val, + status=status_val, + creator_id=task.creator_id, + deadline=task.deadline, + requirements=task.requirements, + progress=task.progress, + created_at=task.created_at, + updated_at=task.updated_at, + courses=courses, + assigned_count=len(task.assignments) if task.assignments else 0, + completed_count=completed_count + )) return ResponseModel( data=PaginatedResponse.create(