1

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

python manage.py inspectdb --database=images

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

python manage.py migrate --database=images

我收到这样的错误:

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

所有引发错误的表都是多对多链接表,其中包含两个 id 字段,它们共同构成主键(因此必须是“唯一的”)。

这是由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'),)

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

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

4

2 回答 2

2

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

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

于 2016-09-07T09:36:11.747 回答
0

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

这是我的工作模型代码:

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'),)

此更改使错误消息消失。

于 2016-09-07T09:25:31.070 回答