我试图在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
注意:为了保护隐私,我在这篇文章中修改了一些表和字段的名称,所以如果有些名称不一致,请忽略它。
发布于 2021-06-16 02:10:30
这就是问题所在
在Lab表中
`lab_id` int unsigned NOT NULL AUTO_INCREMENT
处于通知状态时
lab_extension_id` int DEFAULT NULL
这些字段是不同的,不能设置为foreignKeys,请将一种类型移动到另一种类型。
https://stackoverflow.com/questions/67989992
复制相似问题