Django中如何筛选当前登录学生关联的Enrollment外键数据
实现方法
针对你的模型关系,有两种可靠的方式查询当前登录学生对应的Enrollment数据:
方式一:直接跨关联表查询(推荐,性能更好)
Django ORM支持通过双下划线__实现跨关系字段过滤,不需要提前查询StudentData实例,单次数据库查询即可拿到结果:
log_user = request.user # 匹配Enrollment关联的StudentData记录中,user字段等于当前登录用户的所有数据 student_enrollments = Enrollment.objects.filter(student__user=log_user)
查询得到的student_enrollments是可迭代的QuerySet,直接传入模板即可渲染对应选课记录。
方式二:通过学生实例反向查询
如果页面同时需要展示学生的姓名、院系、专业等基础信息,可以先获取当前用户绑定的StudentData实例,再通过外键反向关联拿到Enrollment数据:
log_user = request.user # StudentData和CustomUser是一对一关系,用get()获取唯一匹配的实例,不要直接用filter()返回的QuerySet current_student = StudentData.objects.get(user=log_user) # Django会为外键字段自动生成反向查询属性,默认命名规则为「关联模型名小写_set」 student_enrollments = current_student.enrollment_set.all() # 学生基础信息可以直接复用current_student,不需要额外查询 student_information = current_student
异常兼容
为了避免当前登录用户没有绑定StudentData档案时抛出DoesNotExist异常,可以增加空值判断:
log_user = request.user current_student = StudentData.objects.filter(user=log_user).first() if not current_student: # 无匹配学生档案时返回空查询集,模板渲染不会触发报错 student_enrollments = Enrollment.objects.none() student_information = None else: student_enrollments = current_student.enrollment_set.all() student_information = current_student
内容的提问来源于stack exchange,提问作者Amiable.Azam
相关产品推荐
相关产品推荐

