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

Django访问Attendance表报错:Unknown column 'polls_attendance.Voter_id'

解决Django Admin访问Attendance表时的OperationalError问题

这个错误的核心原因是模型字段名的大小写导致数据库列名不匹配:你在Attendance模型里定义了大写开头的Voter外键字段,Django在生成SQL查询时会尝试查找Voter_id列,但实际数据库中生成的列名是小写的voter_id(Django默认会将字段名转换为小写来生成数据库列名),两者不匹配就抛出了这个未知列的错误。

下面是两种可行的解决方案:

方案一:遵循PEP8规范修改字段名(推荐)

Django模型字段名建议使用小写字母加下划线的命名风格,这能避免很多不必要的大小写问题:

  1. 修改Attendance模型的字段名:
class Attendance(models.Model):
    ABSENT = 0
    PRESENT = 1
    # 把大写的Voter改成小写的voter
    voter = models.ForeignKey(Voter, on_delete=models.CASCADE, db_index=True)
    attendance_list = models.ForeignKey(AttendanceList, on_delete=models.CASCADE)
    present = models.BooleanField(default=ABSENT)
    
    # 如果之前有引用该字段的代码(比如__str__),也要同步修改
    def __str__(self):
        return f"{self.voter} - {'Present' if self.present else 'Absent'}"
  1. 生成新的迁移文件并应用:
python manage.py makemigrations
python manage.py migrate

方案二:显式指定数据库列名(仅用于无法修改字段名的场景)

如果你不想修改字段名,可以通过db_column参数强制指定Django使用正确的列名:

class Attendance(models.Model):
    ABSENT = 0
    PRESENT = 1
    Voter = models.ForeignKey(
        Voter, 
        on_delete=models.CASCADE, 
        db_index=True,
        db_column='voter_id'  # 显式指定数据库中实际的列名
    )
    AttendanceList = models.ForeignKey(
        AttendanceList, 
        on_delete=models.CASCADE,
        db_column='attendancelist_id'  # 同步指定该字段的列名避免后续问题
    )
    Present = models.BooleanField(default=ABSENT)

然后执行迁移命令更新数据库:

python manage.py makemigrations
python manage.py migrate

额外提醒

  • 尽量保持模型字段名的小写下划线风格,这不仅符合Python的PEP8规范,也能避免数据库层面的大小写敏感问题(不同数据库对大小写的处理可能不同,比如MySQL在某些配置下会区分列名大小写)。
  • 如果你之前手动修改过数据库表结构,一定要确保迁移文件和实际数据库结构一致,否则很容易出现这类不匹配的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:31:37