首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >django.db.utils.OperationalError: 3780引用列和引用列不兼容

django.db.utils.OperationalError: 3780引用列和引用列不兼容
EN

Stack Overflow用户
提问于 2021-06-16 00:19:11
回答 1查看 374关注 0票数 0

我试图在Django中的两个模型之间添加一个外键关系,但是我得到了这个错误。

Notification型号:

代码语言:javascript
运行
复制
class Notification(models.Model):
    ...
    lab_extension = models.ForeignKey(Labs, on_delete=models.CASCADE, null=True, to_field='lab_id')
    ...

Lab模型

代码语言:javascript
运行
复制
class Lab(models.Model):
    ...
    lab_id = models.AutoField(primary_key=True)
    ...

在将这个外键字段分配给Notification模型之后,我在执行python manage.py migrate时得到以下错误

代码语言:javascript
运行
复制
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会给我带来这样的结果:

代码语言:javascript
运行
复制
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会给我带来这样的结果:

代码语言:javascript
运行
复制
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

注意:为了保护隐私,我在这篇文章中修改了一些表和字段的名称,所以如果有些名称不一致,请忽略它。

EN

回答 1

Stack Overflow用户

发布于 2021-06-16 02:10:30

这就是问题所在

在Lab表中

代码语言:javascript
运行
复制
  `lab_id` int unsigned NOT NULL AUTO_INCREMENT

处于通知状态时

代码语言:javascript
运行
复制
lab_extension_id` int DEFAULT NULL

这些字段是不同的,不能设置为foreignKeys,请将一种类型移动到另一种类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67989992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档