首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么'Django Migrate‘在添加null=True时重新创建外键约束?

为什么'Django Migrate‘在添加null=True时重新创建外键约束?
EN

Stack Overflow用户
提问于 2019-09-19 18:29:36
回答 1查看 47关注 0票数 2

下面是Django model.pygit diff输出。

代码语言:javascript
运行
复制
-    live = models.ForeignKey('live.Live', on_delete=models.CASCADE,
-                             related_name='live_likes')
+    live = models.ForeignKey('live.Live', on_delete=models.SET_NULL,
+                             related_name='live_likes', null=True)

它们之间唯一的区别是null=True,我认为Django只运行SQL,而不是NOT NULL

但是,它是Djangosqlmigrate的实际输出。

代码语言:javascript
运行
复制
SET CONSTRAINTS "live_like_live_id_0374bfe6_fk_live_live_id" IMMEDIATE;
ALTER TABLE "live_like" DROP CONSTRAINT "live_like_live_id_0374bfe6_fk_live_live_id";
ALTER TABLE "live_like" ALTER COLUMN "live_id" DROP NOT NULL;
ALTER TABLE "live_like" ADD CONSTRAINT "live_like_live_id_0374bfe6_fk_live_live_id" FOREIGN KEY ("live_id") REFERENCES "live_live" ("id") DEFERRABLE INITIALLY DEFERRED;

令人惊讶的是,它做了额外的操作,重新创建了与前一个相同的外键约束。

这在Django是正常的吗?为什么?

我认为这个额外的操作可能会导致生产服务器端的巨大失败。

(Django 2.0.5,PostgreSQL 9.6.9)

EN

回答 1

Stack Overflow用户

发布于 2021-10-29 19:20:20

我刚刚遇到了这个,我相信这是https://code.djangoproject.com/ticket/25253在野外的一个变体。

tldr将运行原始sql来添加约束,并使用state_operations指令使Django对您的更改感到满意,这样它就不会继续重新创建外键。https://code.djangoproject.com/ticket/25253#comment:15就是一个很好的例子。

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

https://stackoverflow.com/questions/58009009

复制
相关文章

相似问题

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