python - 如何使用现有数据库覆盖 Django 中的 M2M 字段名称和模型?
问题描述
我正在使用 Django 3.1.3 并使用现有的 postgresql 数据库。该数据库的大多数模型和字段名称选择不当和/或太长。大多数情况下,使用一些方便的 Django 选项可以很容易地更改它们,如下所示:
class NewModelName(models.Models):
new_field_name = models.CharField(max_length=50, db_column='old_field_name')
class Meta:
managed=False
db_table='database_old_table_name'
但是假设我想更改 M2M 字段名称和相应的模型名称。我想要类似的东西:
class Foo(models.Models):
new_m2m_field_name = models.ManyToManyField('RelatedModel', blank=True, db_column='old_m2m_field_name')
class Meta:
managed=False
db_table='foo_old_table_name'
class RelatedModel(models.Models):
name = models.CharField(max_length=50)
class Meta:
managed=False
db_table='related_model_old_table_name'
但是如果我这样做,Django 会抛出一个错误,说明
django.db.utils.ProgrammingError: relation "foo_new_m2m_field_name" does not exist
. 就像它忽略了这个db_column
选项。知道如何获得类似的结果吗?
谢谢!
解决方案
来自关于ManyToManyField的 Django 文档
ManyToManyField.db_table
为存储多对多数据而创建的表的名称。如果没有提供,Django 将根据以下名称假定默认名称:定义关系的模型的表和字段本身的名称。
还取决于原始数据库中的列名(非标准名称),您可能必须通过模型(数据透视表)定义为通过表
推荐阅读
- javascript - Flutter 无法使用脚本为范围注册 ServiceWorker,该脚本具有不受支持的 MIME 类型
- java - Spark 作业丢失执行程序:错误 TaskSchedulerImpl:丢失执行程序 1... -> ./app.jar:设备上没有剩余空间
- wordpress - 检测请求的页面是否是服务器端 WordPress 上的 PWA
- javascript - 如何创建一个检查对象中是否存在属性的函数?
- cmake - 将 ceres 链接到 CGAL 以使用 smooth_mesh() 函数
- python-3.x - scikit-learn:由于 SelectKBest() 导致的最重要特征与未编辑数据的 DecisionTreeClassifier() 中顶部节点的特征不同?
- python - Beautifulsoup findAll 返回一个空列表
- node.js - MEAN 网站仪表板的 Docker 容器在 Docker 中不起作用。Nodejs不断重启
- flask - 如何在 Flask-Classful 中设置 Flask-Limiter?
- vue.js - Vite 库模式入口点