【问题标题】:django user model and custom primary key fielddjango 用户模型和自定义主键字段
【发布时间】:2011-04-08 04:12:51
【问题描述】:

默认情况下,Django 在每个模型上创建一个名为“id”的主键字段,类型为AutoField。在我的模型上,我通过使用“primary_key”属性覆盖它以使用自定义UUIDField 作为主键。我还希望django.contrib.auth 中的User 模型具有UUIDField 作为主键,但如果不更改User 模型源代码,这似乎是不可能的。

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

【问题讨论】:

    标签: python django


    【解决方案1】:

    随着 Django 1.5 的发布,身份验证后端现在支持自定义用户模型:

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

    电子邮件字段可以用作用户名字段,并且可以在其上设置primary_key 参数:

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

    【讨论】:

    【解决方案2】:

    如果不更改用户模型源代码,这似乎是不可能的。

    正确。除非您愿意更改(或替换)User,否则没有办法。

    执行此操作的一种(脆弱的、骇人听闻的)方法是为每个 User 实例附加一个 UserProfile。每个User 应该恰好有一个 UserProfile。然后,您可以将您的 UUIDField 添加到配置文件中。您仍然需要进行自定义查询才能将UUIDField 转换为id

    如果你不喜欢UserProfile 这个名字,你可以适当地重命名它。关键是你和User是一对一的关系。

    【讨论】:

    • 我想会是这样。谢谢。
    • 请注意,这个答案早已过时。请参阅 Soviuts 的答案。
    【解决方案3】:

    可以仅利用 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']
    

    【讨论】:

      猜你喜欢
      • 2021-04-15
      • 2016-08-13
      • 2018-06-05
      • 2017-03-31
      • 1970-01-01
      • 2015-06-13
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多