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,可能会破坏兼容性,如弃用时间表中所述。
我有一个遗留数据库,希望在我的 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,可能会破坏兼容性,如弃用时间表中所述。