Ниже 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 drop NOT NULL
.
Однако, это реальный результат sqlmigrate
из Django
.
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)