Django 用户模型和自定义主键字段

9 投票
3 回答
19346 浏览
提问于 2025-04-16 03:42

Django 默认会在每个模型上创建一个名为 "id" 的主键字段,类型是 AutoField。在我的模型中,我通过使用 "primary_key" 属性来覆盖这个设置,使用自定义的 UUIDField 作为主键。我还希望 django.contrib.auth 中的 User 模型也能使用 UUIDField 作为主键,但这似乎不可能,除非我修改 User 模型的源代码。

有没有什么推荐的方法来解决这个问题?

3 个回答

5

你可以只使用 AbstractUser,然后做以下的修改:

class CustomUser(AbstractUser):
    email = models.EmailField(max_length=254, unique=True, db_index=True, primary_key=True)
    name = models.CharField(max_length=50)

    USERNAME_FIELD = 'email'
    REQUIRED_FILEDS = ['name']
10

随着Django 1.5的发布,认证系统现在支持自定义用户模型了:

https://docs.djangoproject.com/en/dev/topics/auth/customizing/#substituting-a-custom-user-model

你可以把电子邮件字段用作用户名字段,并且可以在这个字段上设置主键参数:

class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=254, unique=True, db_index=True, primary_key=True)

    USERNAME_FIELD = 'email'
7

这似乎不可能,除非你改变用户模型的源代码。

没错。除非你愿意修改(或者替换)User,否则没有其他办法。

有一种(不太靠谱,算是变通的方法)可以做到这一点,就是为每个User实例添加一个UserProfile。每个User应该有且仅有一个UserProfile。然后你可以把你的UUIDField加到这个个人资料里。不过,你仍然需要进行一些自定义查询,把UUIDField转换成id

如果你不喜欢UserProfile这个名字,可以给它起个合适的名字。关键是你要和User保持一对一的关系。

撰写回答