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

Django中使用关联表字段分组报错,请求解决方案

问题解决:Django跨表values查询触发FieldError错误

错误原因

你在values查询中使用了students__testresults__tests__name,但你的TestResults模型里关联Tests的外键字段是test_id,而非tests。Django的跨表查询是基于模型字段名,而非关联的模型名。当你写tests__name时,Django会将tests当作TestResults的字段查找,但该模型不存在名为tests的字段,因此它尝试对test_id(BigAutoField类型)执行tests lookup,最终触发报错。

而students__testresults__score能正常运行,是因为score是TestResults的直接字段,查询路径完全匹配。

解决方法

将查询路径中的tests替换为外键字段名test_id即可:

print(Classes.objects.values('name', 'students__testresults__test_id__name'))

额外优化建议

为了提升代码可读性,建议给外键字段设置语义化名称(或保留原字段名并添加related_name),避免用xxx_id这类后缀:
修改models.py中的外键定义:

from django.db import models

class Tests(models.Model):
    name = models.CharField(max_length=50)
    class Meta:
        db_table='tests'

class TestResults(models.Model):
    student = models.ForeignKey(
        'Students', on_delete=models.CASCADE
    )
    test = models.ForeignKey(
        'Tests', on_delete=models.CASCADE
    )
    score = models.IntegerField()
    class Meta:
        db_table='testreults'

class Students(models.Model):
    clazz = models.ForeignKey(
        'Classes', on_delete=models.CASCADE
    )
    name = models.CharField(max_length=50)
    grade = models.IntegerField()
    class Meta:
        db_table='students'

class Classes(models.Model):
    name = models.CharField(max_length=50)
    class Meta:
        db_table='classes'

修改后查询路径会更直观:

print(Classes.objects.values('name', 'students__testresults__test__name'))

内容的提问来源于stack exchange,提问作者mito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:26:31