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
相关产品推荐
相关产品推荐

