从视图双引号引用模型时的Django错误

时间:2018-10-01 15:42:01

标签: django django-models django-views

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')

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

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

  

('42S22',“ [42S22] [Microsoft] [SQL Server的ODBC驱动程序17] [SQL   服务器]无效的列名“ id”。 (207)(SQLExecDirectW); [42S22]   [Microsoft] [用于SQL Server的ODBC驱动程序17] [SQL Server]声明   无法准备。 (8180)“)

1 个答案:

答案 0 :(得分:0)

因此,此问题的答案是,如果未在相关模型中分配特定的唯一/主键,则将应用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)