Django查询数据表时报no such column: AGC.id错误如何解决?
问题根因
- 你使用的是已存在的AGC数据表,Django默认给无显式主键的模型加
id主键的逻辑,只适用于Django自己通过迁移创建的表,你现有表本身没有id字段,所以查询时就触发了no such column: AGC.id的报错 - 模板代码存在两处错误:一是循环变量名是
AGC,但实际调用时写成了类名Agc,即便主键问题解决也会取不到值;二是表格列数和表头不匹配,多输出了一列重复的index值
修复步骤
步骤1:修正模型主键配置
两种方案二选一,根据你现有表的实际情况选择:
方案A:指定现有字段为主键(优先选择,不需要修改现有表结构)
如果你的index字段是唯一且非空的,直接修改模型的index字段定义,加上primary_key=True,Django就不会自动生成id主键了:
class Agc(models.Model): index = models.BigIntegerField(primary_key=True, blank=True, null=True) area = models.TextField(db_column='AREA', blank=True, null=True) # Field name made lowercase. periodo = models.BigIntegerField(db_column='PERIODO', blank=True, null=True) # Field name made lowercase. demanda = models.TextField(db_column='DEMANDA', blank=True, null=True) # Field name made lowercase. This field type is a guess. class Meta: db_table = 'AGC'
修改后执行迁移时加--fake参数,避免Django尝试修改现有表结构:
python manage.py makemigrations python manage.py migrate --fake
方案B:给现有AGC表加id字段
如果没有合适的现有字段当主键,你需要先手动给数据库里的AGC表新增一个自增整数类型的id列,设为主键,之后不需要修改模型,Django默认的id主键逻辑就能正常运行。
步骤2:修正模板代码
把模板里所有Agc.xxx的写法改成循环变量AGC.xxx,同时删掉多余的重复index列,修正后的循环部分代码如下:
{% if AGCs %} {% for AGC in AGCs %} <tr> <th scope='row'>{{ AGC.id }}</th> <td>{{ AGC.index }}</td> <td>{{ AGC.area }}</td> <td>{{ AGC.periodo }}</td> <td>{{ AGC.demanda }}</td> </tr> {% endfor %} {% else %} <h1>No hay datos </h1> {% endif %}
内容的提问来源于stack exchange,提问作者Jose Sebastian alvarez Mendoza
相关产品推荐
相关产品推荐

