首页 > 解决方案 > 从视图双引号引用模型时出现 Django 错误

问题描述

ProgrammingError at /app-name/url-name
    relation "TableName" does not exist
    LINE 1: SELECT (1) AS "a" FROM "TableName" WHERE "TableName..."

我做了一个inspectdb,确认映射与运行时自动设置的匹配makemigrations,并从 django_migrations 表中删除所有迁移并重新运行migrate。我还通过查看 django_migrations 表以及运行来检查迁移是否成功导入showmigrations

我想知道为什么我在表名周围看到双引号,这就是为什么不能使用新模型的原因?有趣的是,如果我引用要在表单(不是视图)中使用的模型,它似乎可以正常工作,我会在表单中看到来自数据库的正确输入。当我使用 Django 查询时发生错误 - 此查询是在同一模型“TableName”本身中设置的,是否正确引用?(而不是从 app-name.models 导入 TableName)

TableName.objects.using('CUSTOMDBSETTING').filter(colid='value')

请注意,当我尝试直接使用 shell 时,这有效,而不是通过 Django。我也没有这个表的主键,当我尝试设置一个非默认值(不是 id)时,它给了我另一个错误。

因此,当我尝试引用表映射中的主键(但不是)时,它确实给了我错误。当我尝试删除特定 id 的主键时(仅在模型中,不在迁移中)

('42S22', "[42S22] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]列名 'id' 无效。(207) (SQLExecDirectW); [42S22] [Microsoft][ODBC Driver 17 for SQL服务器][SQL Server]无法准备语句。(8180)")

标签: djangodjango-modelsdjango-views

解决方案


因此,这个问题的答案是,如果没有在相关模型中分配特定的唯一/主键,则将应用 Django 中映射的默认“id”。

也就是说,希望您的迁移具有这样的主键(模型映射不会明确显示这一点):

fields=[
    ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
...
]

要解决此问题,请使用 Django 中的主键“id”或设置主键 - 不必为实际表执行此操作,只需 Django 模型即可。然后重新运行迁移并确保它们适用于捕获此更改......现在,迁移应该看起来像这样(并且不会使用“id”键)

 ('tableid', models.CharField(blank=True, db_column='TableID', max_length=255, primary_key=True, serialize=False)),

或类似的东西,如果它是自动递增的

customid = models.AutoField(db_column='CustomID', null=False, primary_key=True, max_length=10)

推荐阅读