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

时间:2016-09-07 09:25:31

标签: python django inspectdb

我有一个遗留数据库,我希望在我的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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

django的inspectdb将我的旧字段名称作为unique_together的字段名称。我改变了这个,所以它使用了模型中的属性,解决了这个问题。我还在id之前添加了_,如上面列出的google groups帖子中所述。但我不确定该下划线是否相关。现在,我不想搞砸我的设置,所以我把测试结果用下划线(或者说没有下划线)留给别人。 :-)如果我有时间测试,我会发布我在这里找到的内容。

这是我的工作模型代码:

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

此更改使错误消息消失。