django - 从视图双引号引用模型时出现 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)")
解决方案
因此,这个问题的答案是,如果没有在相关模型中分配特定的唯一/主键,则将应用 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)
推荐阅读
- python - Django:打开PDF文件对象
- php - Magento 2:数据库用户没有足够的权限
- vba - SAP GUI 脚本 - 按钮按下失败
- javascript - 在 React with Jest 中测试条件和 useEffect
- javascript - 管道同时允许多个过滤器值 - Angular
- linux - 如何确定我的 linux 平台是否支持强别名?
- forms - 如何在对象上应用表单验证器
- ionic-framework - IONIC 4 - 以编程方式路由时选项卡图标保持选中状态
- php - Laravel 使用 ajax/jquery 通过模态上传图片
- reactjs - 如何在 Reactjs 中单击按钮时重定向到另一个页面