官方文档说「一开始就用自定义 User」。晚了到底会怎样?这篇分别做「一开始就自定义」「已迁移后再切换」「只加字段用 Profile」三种情形,把报错原文和数据库状态摆出来。
makemigrations: ["Migrations for 'lab':", 'lab/migrations/0001_initial.py', '+ Create model User'] migrate rc = 0 最后一行: Applying sessions.0001_initial... OK get_user_model() = lab.models.User 表名 = lab_user 是否还有 auth_user 表: False 自定义字段: 1
所有指向用户的外键都要写 settings.AUTH_USER_MODEL(字符串),代码里取模型用 get_user_model(),不要直接 from django.contrib.auth.models import User。
默认 User 里已有用户: 1 换成 lab.User 之后 makemigrations: + Create model User migrate: django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency lab.0001_initial on database 'default'. 表: ['auth_user', 'auth_user_groups', 'auth_user_user_permissions']
报错的原因:admin 等应用的迁移依赖了用户模型(settings.AUTH_USER_MODEL),已经在默认 User 上应用过;换了之后依赖顺序被破坏。原有 auth_user 表和数据没有自动搬到新表。
migrate rc = 0 u.profile.phone = 1
代价是多一次 JOIN 或查询(可用 select_related,第 28 篇)。