django inspectdb 'unique_together' 指的是不存在的字段

django inspectdb 'unique_together' refers to the non-existent field

我有一个遗留数据库,希望在我的 Django 项目中用作第二个数据库。我将数据库添加到我的设置文件中,并且 运行:

python manage.py inspectdb --database=images

脚本在不到一秒的时间内完成,结果令人震惊。它理解我所有的表格——或者我一开始是这么想的。当我尝试 运行:

python manage.py migrate --database=images

我遇到这样的错误:

'unique_together' refers to the non-existent field 'commentaryId'.

所有引发错误的表都是多对多链接表,包含两个共同构成主键的 id 字段(因此必须是 'unique together')。

这是一个由 inspectdb 创建的模型,它引发了这个错误:

class Pagescanannotationscommentaries(models.Model):
    pagescanannotationid = models.IntegerField(db_column='pageScanAnnotationId')  # Field name made lowercase.
    commentaryid = models.IntegerField(db_column='commentaryId')  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'PageScanAnnotationsCommentaries'
        unique_together = (('pageScanAnnotationId', 'commentaryId'),)

我在 Whosebug 中发现了几个类似我的问题,但这些建议对我没有帮助,或者显然不相关。但我确实在 google 组中找到了一个 post,它给了我修复它的提示:https://groups.google.com/forum/#!topic/django-users/_phTiifN3K0

但即便如此,我发现我的问题还是有点不同,我在下面的答案中进行了解释。

django 的 inspectdb 将我的旧字段名称作为 unique_together 的字段名称。我对此进行了更改,因此它使用了模型中的属性,这解决了问题。我还在 id 之前添加了 _,如上面列出的 google 组 post 中所述。但我不确定下划线是否相关。现在,我不想弄乱我的设置,所以我将带有下划线(或者更确切地说没有下划线)的测试留给其他人。 :-) 如果我有时间测试它,我会 post 我在这里找到的东西。

这是我的工作模型代码:

class Pagescanannotationscommentaries(models.Model):
    pagescanannotation_id = models.IntegerField(db_column='pageScanAnnotationId')  # Field name made lowercase.
    commentary_id = models.IntegerField(db_column='commentaryId')  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'PageScanAnnotationsCommentaries'
        unique_together = (('pagescanannotation_id', 'commentary_id'),)

此更改使错误消息消失。

这是 Django 1.8 中的错误,请参阅 #25274。它已在 1.8.8 中修复。您应该升级到最新的 1.8.x 版本。

请注意,从 1.8.x 到 1.8.x+1 的次要版本升级仅包括错误修复和安全更新。您应该始终以使用最新的次要版本为目标。只有主要版本升级,从 1.Y 到 1.Y+1,可能会破坏兼容性,如弃用时间表中所述。