python - 如何为数据库模型手动创建正确的主键
问题描述
我的问题有点类似于这里讨论的问题: Django automatically create primary keys for existing database tables
但不是简单,而是python manage.py inspectdb
我做了python manage.py inspectdb --include-views
。我的问题是那些基于视图的类——我明白了Error 1054, ("Unknown column 'station_measurements_with_data.id' in 'field list'")
我试图简单地添加id = models.IntegerField(primary_key=True)
到模型中,但没有任何乐趣。
模型类如下所示:
class StationMeasurementsWithData(models.Model):
station_id = models.IntegerField()
measurement_id = models.IntegerField()
time_utc = models.DateTimeField()
pollution_name = models.CharField(max_length=45)
measurement_value = models.FloatField(blank=True, null=True)
class Meta:
managed = False # Created from a view. Don't remove.
db_table = 'station_measurements_with_data'
数据库中的视图数据如下所示:
# station_id, measurement_id, time_utc, pollution_name, measurement_value
955, 87318, 2012-01-01 02:00:00, pm2.5, 73
955, 87318, 2012-01-01 02:00:00, pm10, 308
956, 87319, 2012-01-01 02:00:00, pm2.5, 123
956, 87319, 2012-01-01 02:00:00, pm10, 152
957, 87320, 2012-01-01 02:00:00, pm2.5, 163
957, 87320, 2012-01-01 02:00:00, pm10, 198
如果任何列包含唯一值,我只会将其设为主键,但没有。在这种情况下我该怎么办?
解决方案
inspectdb
management 命令仅生成反映其运行的数据库中的表和视图的模型。
如果您不声明它,则将自动主键字段添加到模型中。为避免以后的代码读者混淆,建议在使用非托管模型时指定您正在建模的数据库表中的所有列。
参考:https ://docs.djangoproject.com/en/2.2/ref/models/options/#managed
我建议重新创建包含id
字段的视图。
如果您的数据库服务器是或为您的特定数据库服务器找到另一种方式,您可以ROW_NUMBER
在结果集上使用窗口函数模拟自动递增的 id 。例如postgresql
CREATE VIEW v_foo AS
SELECT ROW_NUMBER() OVER () AS id, [[rest fields]] FROM foo;
推荐阅读
- php - 在 Firebase Admin SDK for PHP 中设置应用程序
- javascript - Fullpage.js - 如何只触发一次 onLeave 函数?
- indexing - 何时使用 Neo4j 4.3 中的标签和关系类型索引?
- javascript - 柏。If else 施工
- mysql - MSQL 从带有子查询和 1 个值的选择语句中插入多行
- reactjs - 这是使用 React-Three-Fiber 每秒渲染精灵位置的最佳方式吗?
- excel - 使用 Kotlin 阅读在线 Excel 电子表格
- kotlin - 使用 swagger codegen 使 Kotlin 模型可序列化
- flutter - 如何在颤动的提升按钮中创建渐变颜色?
- reactjs - echarts-for-react 以编程方式展开和折叠树中的叶子