You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 17:51:31