下面是Django model.py
的git diff
输出。
- 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)
发布于 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就是一个很好的例子。
https://stackoverflow.com/questions/58009009
复制相似问题