以 UUID 作为 id 字段的自定义 Django 用户模型

问题描述 投票:0回答:2

我正在尝试扩展用户模型并添加一些字段,以下是我的方法:

Class UserProfile(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    mobile_number = models.CharField(max_length=20)
    gender = models.CharField(max_length=2, choices=GENDER_CHOICES)
    location = models.ForeignKey(Location, blank=True, null=True)

class User_One(UserProfile):
    field_1 = models.CharField(max_length=20)
    ....
    ....

class User_Two(UserProfile):
    field_1 = models.CharField(max_length=20)
    ....
    ....

所以基本上有两种类型的用户

User_One
User_Two
,现在每当我们将这两种类型的用户保存到数据库中时,就会发生以下情况

  1. 将使用值 1、2、3 等的单独 id 创建
    User
    模型记录,
  2. 将创建
    User_One
    模型记录,id 为 1,2,3
  3. 将创建
    User_Two
    模型记录,id 为 1,2,3

因此,对于每个模型记录保存,Django 或数据库都会生成 id 的 1,2,3。

但是我要求用户模型应该为 id 字段值生成

uuid
来代替整数,这可能吗?

我的意思是像下面这样

class User_Profile(models.Model):
    id = models.IntegerField(default=uuid.uuid4)
python django django-models django-users
2个回答
4
投票

使用 uuid 作为主键需要几个额外的步骤:

  1. 使用
    UUIDField
    作为您的 id 字段,而不是
    InegerField
    ,因为 uuid 不完全是整数
  2. 为该字段指定
    primary_key=True

要获取自定义用户模型,请将其子类化为

django.contrib.auth.models.AbstractUser
并在设置中指定
AUTH_USER_MODEL

import uuid
from django.contrib.auth.models import AbstractUser
from django.db import models

class UserProfile(AbstractUser):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4)

然后在您的设置文件中:

AUTH_USER_MODEL = 'youruserapp.UserProfile'

在进行任何迁移(创建数据库)之前执行此操作很重要,否则这将不起作用。


0
投票

这是一个老问题,但是关于如何扩展

AbstractUser
(或
AbstractBaseUser
)、更新模型、管理器等的非常好的资源可以在这里找到:https://testdriven.io/blog /django-自定义用户模型

© www.soinside.com 2019 - 2024. All rights reserved.