【发布时间】:2021-08-31 12:36:07
【问题描述】:
我正在尝试在 Django 中的两个模型之间添加外键关系,但出现此错误。
Notification模特:
class Notification(models.Model):
...
lab_extension = models.ForeignKey(Labs, on_delete=models.CASCADE, null=True, to_field='lab_id')
...
Lab型号
class Lab(models.Model):
...
lab_id = models.AutoField(primary_key=True)
...
将此外键字段分配给Notification 模型后,我在执行python manage.py migrate 时收到此错误:
django.db.utils.OperationalError: (3780, "Referencing column 'lab_extension_id' and referenced column 'lab_id' in foreign key constraint [constraint name] are incompatible.")
如果我从 Lab 模型中删除 AutoField 并使用默认 id 字段,则此错误可能不会持续存在。但我正处于无法做到这一点的项目中。我还意识到外键字段通常不可为空,但对于这个项目,Notification 模型可能指向也可能不指向 Lab 模型。
SHOW CREATE TABLE notification 给了我这个:
notification_notification, CREATE TABLE `notification_notification` (
`id` int NOT NULL AUTO_INCREMENT,
`read` tinyint(1) NOT NULL,
`message` longtext NOT NULL,
`user_id` int NOT NULL,
`category` varchar(2) NOT NULL,
`created` datetime(6) NOT NULL,
`question_id` int DEFAULT NULL,
`submission_id` int DEFAULT NULL,
`update_request_id` int DEFAULT NULL,
`lab_extension_id` int DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `notification_notific_user_id_e9d6f5f4_fk_user_mana` (`user_id`),
KEY `notification_notification_question_id_af1ad55d_fk_qa_question_id` (`question_id`),
KEY `notification_notific_submission_id_78f78d05_fk_community` (`submission_id`),
KEY `notification_notific_update_request_id_39cf03ba_fk_community` (`update_request_id`),
CONSTRAINT `notification_notific_submission_id_78f78d05_fk_community` FOREIGN KEY (`submission_id`) REFERENCES `community_communitysubmission` (`id`),
CONSTRAINT `notification_notific_update_request_id_39cf03ba_fk_community` FOREIGN KEY (`update_request_id`) REFERENCES `community_submissionupdaterequest` (`id`),
CONSTRAINT `notification_notific_user_id_e9d6f5f4_fk_user_mana` FOREIGN KEY (`user_id`) REFERENCES `user_manager_user` (`id`),
CONSTRAINT `notification_notification_question_id_af1ad55d_fk_qa_question_id` FOREIGN KEY (`question_id`) REFERENCES `qa_question` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3241 DEFAULT CHARSET=latin1
SHOW CREATE TABLE lab 给了我这个:
lab, CREATE TABLE `lab` (
`lab_id` int unsigned NOT NULL AUTO_INCREMENT,
`user_id` int unsigned NOT NULL,
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
`project_dir` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '/opt/PacketAccess/',
`lab_model` int unsigned NOT NULL DEFAULT '0',
`project_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
`pn_account` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
`deployed` int NOT NULL,
`progress` int NOT NULL,
`request_time` int NOT NULL,
`deploy_time` int NOT NULL,
`destroy_time` int NOT NULL,
`user_ip` varchar(260) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`status` int NOT NULL DEFAULT '1',
`labRegion` varchar(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT 'EWR1',
`pn_progress` int NOT NULL,
`pn_project_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT 'n/a',
`pn_host_name` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT 'unknown',
`pn_device_id` varchar(255) COLLATE utf8_bin NOT NULL,
`pn_device_ip` varchar(40) COLLATE utf8_bin NOT NULL,
`pn_sdn_ip` varchar(40) COLLATE utf8_bin NOT NULL,
`pn_nfmp_ip` varchar(40) COLLATE utf8_bin NOT NULL,
`pn_flow_ip` varchar(40) COLLATE utf8_bin NOT NULL,
`pn_nfmt_ip` varchar(40) COLLATE utf8_bin NOT NULL,
`pn_nrcx_ip` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '0.0.0.0',
`pn_nrcs_ip` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '0.0.0.0',
`pn_elastic_ip` varchar(40) COLLATE utf8_bin NOT NULL,
`lab_version` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '17.3',
`lab_tags` varchar(255) COLLATE utf8_bin NOT NULL,
`user_email` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT 'n/a',
`voucher_id` int NOT NULL,
`admin_password` varchar(10) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`oss_password` varchar(10) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`deployed_email` text CHARACTER SET utf8 COLLATE utf8_bin,
`lab_name` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`customer_lab_ip` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '0.0.0.0',
`deployment_test` tinyint(1) DEFAULT NULL,
`ssl_enabled` tinyint(1) DEFAULT NULL,
`associated_lab_id` varchar(10) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`lab_id`)
) ENGINE=InnoDB AUTO_INCREMENT=11995 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin
注意:为了保护隐私,我在这篇文章中更改了一些表和字段的名称,所以如果有些名称不一致,请忽略。
【问题讨论】:
-
您是如何创建实验室模型的? DBMS中lab_id字段的类型是什么?
-
你能用'show create table table_name'为有问题的两个表添加表结构吗?
-
@MohamedElKalioby 在帖子中添加了创建表脚本。
标签: python mysql django migration