默认Django认证架构未在用户与组之间创建引用
我正在学习Django,跟着官方教程。
我已经把settings.py配置成使用SQLite数据库,并运行了python manage.py syncdb
。这时生成了一个数据库结构。查看这个结构后,我发现auth_user
表的id
列和auth_user_groups
表的user_id
列之间没有关联。不过,auth_group
表的id
列和auth_user_groups
表的group_id
列之间是有关联的。
为什么auth_user
表和auth_group
表之间没有关联呢?
--..OTHER TABLES
CREATE TABLE "auth_user" (
"id" integer NOT NULL PRIMARY KEY,
"username" varchar(30) NOT NULL UNIQUE,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL,
"email" varchar(75) NOT NULL,
"password" varchar(128) NOT NULL,
"is_staff" bool NOT NULL,
"is_active" bool NOT NULL,
"is_superuser" bool NOT NULL,
"last_login" datetime NOT NULL,
"date_joined" datetime NOT NULL
);
CREATE TABLE "auth_user_groups" (
"id" integer NOT NULL PRIMARY KEY,
"user_id" integer NOT NULL, --why not "user_id" integer NOT NULL REFERENCES "auth_user" ("id") ?
"group_id" integer NOT NULL REFERENCES "auth_group" ("id"),
UNIQUE ("user_id", "group_id")
--...OTHER TABLES
1 个回答
1
SQLite建议使用REFERENCES
这种写法,并且要完全支持外键功能,需要额外设置一个开关。
以前,SQLite根本不支持外键约束,后来虽然添加了这个功能,但需要在每个连接中手动开启,以保持与旧版本的兼容性。对于Django来说,使用REFERENCES
就足够了,这样不仅不限制Django使用较新的版本,还省去了开启外键支持或检查这个功能是否已经编译好的麻烦。