feat: add super-admin stu relationand difficuty

This commit is contained in:
2026-06-18 17:47:16 +08:00
parent e1a5ca2afa
commit 1efcab9123
4 changed files with 45 additions and 6 deletions
+1 -1
View File
@@ -16,7 +16,7 @@
},
"difficulty": {
"type": "string",
"enum": ["easy", "medium", "hard", ""]
"enum": ["", "", "", ""]
},
"chief_complaint": { "type": "string" },
"description": { "type": "string" },
+40 -1
View File
@@ -7,6 +7,7 @@
import re
from django.db import IntegrityError
from django.db.models import Prefetch
from rest_framework import viewsets, filters, status
from rest_framework.decorators import action
from rest_framework.parsers import MultiPartParser, FormParser
@@ -52,6 +53,12 @@ class CmsUserSerializer(serializers.ModelSerializer):
"""读取(列表 / 详情)。"""
institution_name = serializers.CharField(source='institution.name', read_only=True, default=None)
role_label = serializers.SerializerMethodField()
# 师生关系(仅取进行中 status=1):
# - 医生:students = 名下学生 [{id, real_name, phone}]teachers 为 None
# - 学生:teachers = 带教医生 [{id, real_name, phone}]students 为 None
# - 其它角色:两者均为 None。
students = serializers.SerializerMethodField()
teachers = serializers.SerializerMethodField()
class Meta:
model = User
@@ -59,11 +66,33 @@ class CmsUserSerializer(serializers.ModelSerializer):
'id', 'username', 'real_name', 'phone', 'role_type', 'role_label',
'institution', 'institution_name',
'gender', 'title_name', 'major', 'training_stage', 'status', 'created_at',
'students', 'teachers',
]
def get_role_label(self, obj):
return ROLE_LABEL_BY_CODE.get(obj.role_type, obj.role_type)
def get_students(self, obj):
if obj.role_type != 'doctor':
return None
# 优先使用 viewset 预取(prefetch)的关系,避免 N+1
rels = obj.teacher_relations.all() if 'teacher_relations' in getattr(obj, '_prefetched_objects_cache', {}) \
else TeacherStudentRelation.objects.filter(teacher=obj, status=1).select_related('student')
return [
{'id': r.student_id, 'real_name': r.student.real_name, 'phone': r.student.phone}
for r in rels if r.status == 1
]
def get_teachers(self, obj):
if obj.role_type != 'student':
return None
rels = obj.student_relations.all() if 'student_relations' in getattr(obj, '_prefetched_objects_cache', {}) \
else TeacherStudentRelation.objects.filter(student=obj, status=1).select_related('teacher')
return [
{'id': r.teacher_id, 'real_name': r.teacher.real_name, 'phone': r.teacher.phone}
for r in rels if r.status == 1
]
class CmsUserWriteSerializer(serializers.ModelSerializer):
"""新增 / 编辑(role 必填)。"""
@@ -169,7 +198,17 @@ class CmsUserViewSet(viewsets.ModelViewSet):
http_method_names = ['get', 'post', 'head', 'options']
def get_queryset(self):
qs = User.objects.select_related('institution', 'department').all().order_by('-created_at')
# 预取师生关系(仅进行中 status=1)+ 对端用户,列表输出师生关系时避免 N+1
qs = (
User.objects.select_related('institution', 'department')
.prefetch_related(
Prefetch('teacher_relations',
queryset=TeacherStudentRelation.objects.filter(status=1).select_related('student')),
Prefetch('student_relations',
queryset=TeacherStudentRelation.objects.filter(status=1).select_related('teacher')),
)
.all().order_by('-created_at')
)
user = self.request.user
if is_super(user):
return qs
+2 -2
View File
@@ -14,7 +14,7 @@
{
"title": "病例标题",
"case_type": "teaching",
"difficulty": "easy|medium|hard",
"difficulty": "低|中|高",
"chief_complaint": "主诉",
"description": "病例简介/摘要",
"patient_age": 45,
@@ -42,7 +42,7 @@
# 规则
1. `case_type` 固定为 `"teaching"`
2. `difficulty` 根据病例复杂度判断:简单常见病 → easy,需鉴别诊断 → medium,多系统/罕见病 → hard
2. `difficulty` 根据病例复杂度判断:简单常见病 → ,需鉴别诊断 → ,多系统/罕见病 →
3. `patient_age` 为整数,无法判断填 `null`
4. `patient_gender``"male"``"female"`,无法判断填空字符串。
5. 标签类字段(symptom_tags、disease_tags 等)至少各提取 1 个,从原文推断。
+2 -2
View File
@@ -14,7 +14,7 @@
{
"title": "病例标题",
"case_type": "traditional",
"difficulty": "easy|medium|hard",
"difficulty": "低|中|高",
"chief_complaint": "主诉",
"description": "病例简介/摘要",
"patient_age": 45,
@@ -54,7 +54,7 @@
# 规则
1. `case_type` 固定为 `"traditional"`
2. `difficulty` 根据病例复杂度判断:简单常见病 → easy,需鉴别诊断 → medium,多系统/罕见病 → hard
2. `difficulty` 根据病例复杂度判断:简单常见病 → ,需鉴别诊断 → ,多系统/罕见病 →
3. `patient_age` 为整数,无法判断填 `null`
4. `patient_gender``"male"``"female"`,无法判断填空字符串。
5. 标签类字段(symptom_tags、disease_tags 等)至少各提取 1 个,从原文推断。