我有一个遗留数据库,我希望在我的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
但是即便如此,我发现我的问题有点不同,我在下面的答案中解释。
答案 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'),)
此更改使错误消息消失。