【发布时间】:2019-09-19 10:29:35
【问题描述】:
下面是git diff 的Django model.py 输出。
- 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。
但是,它是Django的sqlmigrate的真正输出。
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)
【问题讨论】:
标签: django postgresql