Django中访问数据库模型外键数据的困惑及解决请求
Django视图层获取关联数据问题解决
问题描述
首次使用Django开发,遇到视图层获取关联数据的问题。创建了Students模型存储学生信息,Parents模型通过外键关联对应学生,现需获取当前登录家长关联的学生ID,用于后续考勤、成绩等操作。尝试用Parents.objects.filter(student__id = request.user.id)获取数据,但得到空QuerySet,请求解决。
模型代码(Models.py)
class Students(models.Model): id = models.AutoField(primary_key=True) admin = models.OneToOneField(CustomUser, on_delete=models.CASCADE) gender = models.CharField(max_length=50) address = models.TextField() course_id = models.ForeignKey(Courses, on_delete=models.DO_NOTHING, default=1) session_year_id = models.ForeignKey(SessionYearModel, on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) objects = models.Manager() def __str__(self): return self.admin.first_name + " " + self.admin.last_name class Parents(models.Model): id = models.AutoField(primary_key=True) admin = models.OneToOneField(CustomUser, on_delete=models.CASCADE) gender = models.CharField(max_length=50) student = models.ForeignKey(Students, on_delete=models.CASCADE) relation = models.CharField(max_length=255) address = models.TextField() created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) objects = models.Manager() def __str__(self): return self.admin.first_name + " " + self.admin.last_name
原视图代码
def HOME(request): stud_data = Parents.objects.filter(student__id = request.user.id) print(stud_data) return None
问题分析与解决方案
问题根源
原代码的过滤逻辑错误:student__id = request.user.id是在筛选学生ID等于当前登录用户ID的家长记录,但当前登录用户是家长,其用户ID和关联学生的ID没有直接相等的关系,因此返回空QuerySet。
修正后的视图代码
方式一:直接获取(适用于确定当前用户必有对应家长记录的场景)
def HOME(request): # 获取当前登录用户对应的家长记录 parent = Parents.objects.get(admin=request.user) # 提取关联的学生ID student_id = parent.student.id print(student_id) # 后续可使用student_id查询考勤、成绩等数据 return None
方式二:安全过滤(处理无对应家长记录的异常场景)
def HOME(request): # 过滤出当前登录用户对应的家长记录 parent_query = Parents.objects.filter(admin=request.user) if parent_query.exists(): student_id = parent_query.first().student.id print(student_id) else: # 处理当前用户未关联家长的情况 print("当前用户未绑定任何学生") return None
逻辑说明
当前登录用户(request.user)对应Parents模型的admin字段(一对一关联CustomUser),通过Parents的student外键可直接关联到对应的Students记录,进而获取学生ID。
内容的提问来源于stack exchange,提问作者Anshu Joshi
相关产品推荐
相关产品推荐

