升级到 django 1.11 多对多列未找到

Posted

技术标签:

【中文标题】升级到 django 1.11 多对多列未找到【英文标题】:Upgrading to django 1.11 many to many column not found 【发布时间】:2018-08-20 19:38:56 【问题描述】:

我正在将一个项目从 Django 1.10.8 升级到 1.11,但我的单元测试中突然出现奇怪的错误。

我使用了一个小技巧来更新现有的多对多关系,以使用带有额外“订单”字段的自定义“通过”表。在 1.10 中一切正常,但现在在 1.11 中失败了

django.db.utils.ProgrammingError: column api_session_pollgroups.pollgroup_id does not exist 

我的模型代码如下所示:

class SessionPollGroup(models.Model):
    session = models.ForeignKey('api.Session')
    pollgroup = models.ForeignKey('api.PollGroup')
    order = models.PositiveSmallIntegerField(default=0)

    class Meta:
        db_table = 'api_session_pollgroups'
        ordering = ('order',)

当最初的多对多关系建立时,表“api_session_pollgroups”已经存在,我“劫持”它以添加额外的订单字段。

会话模型上的关系如下所示

    pollgroups = models.ManyToManyField('api.PollGroup',
                                        related_name='sessions',
                                        through=SessionPollGroup)

任何人都知道为什么这将无法在 django 1.11 而不是 1.10 中生成或找到正确的数据库模式?

注意:这似乎只出现在单元测试期间,当我使用常规迁移创建新数据库时,表似乎在我的开发数据库 (postgres) 中正确创建,但在单元测试数据库 (sqlite) 中没有正确创建

谢谢!

编辑:已经扫描了变更日志,但看不到任何关于此的内容。我能想到的最好的办法是与表空间有关,但我不知道到底是什么。

【问题讨论】:

你试过运行makemigrations吗? 是的,什么都没出现:( 【参考方案1】:

看起来问题实际上与相关模型的(很多)更早重命名有关。下面链接的 django 票很好地描述了这个问题:

https://code.djangoproject.com/ticket/29000

重命名模型的早期迁移在 django 1.11 中未正确解决(这已从 1.10 更改),并且在表重命名后未更新相关的外键列名称。票证中详述的 polyfill 迁移操作类为我解决了这个问题。

【讨论】:

以上是关于升级到 django 1.11 多对多列未找到的主要内容,如果未能解决你的问题,请参考以下文章

Django 应用程序之间的多对多关系失败

多对多字段的 Django 1.2.1 内联管理

Django过滤器问题多对多

Laravel 多列上的多对多同步()

使用多对多关系还是多列?

Django查询多对多子集包含