首页 > 解决方案 > 如何使用现有数据库覆盖 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选项。知道如何获得类似的结果吗?

谢谢!

标签: pythondjangopostgresqldjango-rest-frameworkfield

解决方案


来自关于ManyToManyField的 Django 文档

ManyToManyField.db_table为存储多对多数据而创建的表的名称。如果没有提供,Django 将根据以下名称假定默认名称:定义关系的模型的表和字段本身的名称。

还取决于原始数据库中的列名(非标准名称),您可能必须通过模型(数据透视表)定义为通过


推荐阅读