默认Django认证架构未在用户与组之间创建引用

0 投票
1 回答
710 浏览
提问于 2025-04-17 16:05

我正在学习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使用较新的版本,还省去了开启外键支持或检查这个功能是否已经编译好的麻烦。

撰写回答