Django默认为每个模型创建一个名为“id
”的主键字段,类型为AutoField
。在我的模型中,我通过使用“primary_key
”属性将其覆盖为使用自定义的UUIDField
作为主键。我也希望django.contrib.auth
中的User
模型具有UUIDField
作为主键,但似乎除非更改User
模型源代码,否则不可能实现。
是否有建议的方法来解决这个问题?
随着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'
如果不更改用户模型源代码,似乎无法实现。
正确。除非你愿意更改(或替换)User
,否则没有其他方法。
一种(脆弱的,hackish的)方法是为每个User
实例附加一个UserProfile
。每个User
应该只有一个UserProfile
。然后,您可以将您的UUIDField
添加到配置文件中。您仍然需要进行自定义查询,以将UUIDField
转换为id
。
如果您不喜欢UserProfile
这个名称,您可以适当更改它。关键是您与User
之间具有一对一的关系。
可以仅利用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']