Установка уникального идентификатора для модели пользователя при создании пользователя - PullRequest
0 голосов
/ 28 мая 2020

У меня есть собственная пользовательская модель, например:

class User(AbstractBaseUser):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'email'

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

    @property
    def is_staff(self):
        return self.is_admin

Я хочу переопределить primary_key и создать уникальный идентификатор длиной 11 символов при каждом создании пользователя. Как я могу сделать это автоматически при каждом создании пользователя и как убедиться, что ключ уникален?

Спасибо.

Ответы [ 4 ]

1 голос
/ 28 мая 2020

Вы можете создать свое поле с помощью модуля uuid следующим образом.

import uuid
class User(AbstractBaseUser):
    alt_ primary_key=models.CharField(max_length=100, unique=True, default=uuid.uuid4)
    # ...other fields

Этот модуль генерирует случайную строку, но превышает ваш лимит в 11 символов.

0 голосов
/ 29 мая 2020

Я бы рекомендовал добавить поле id (уникальное):

id = models.CharField(
        max_length=11,
        unique=True,
    )

и установить значение в методе сохранения. если вы установите uuid по умолчанию, это вызовет исключение, если тот же uuid создается при создании модели. с [: 11] вы можете ограничить значение до 11 символов.

import uuid
def save(self, *args, **kwargs):
        val = uuid.uuid4[:11]
        while User.objects.filter(id=val).exists():
            val = uuid.uuid4[:11]
        self.id = val
        super(User, self).save(*args, **kwargs)
0 голосов
/ 29 мая 2020

У меня все заработало !! Вот как:

Добавьте поле идентификатора:

id = models.CharField(
        max_length=11,
        unique=True,
        primary_key=True,
        blank=True,
    )

Затем переопределите метод сохранения:

def save(self, *args, **kwargs):
        id = secrets.token_urlsafe(8)
        while User.objects.filter(id=id).count() != 0:
            id = secrets.token_urlsafe(8)
        self.id = id
        super(User, self).save(*args, **kwargs)

вам также необходимо импортировать секреты вверху.

Надеюсь, это поможет !!

0 голосов
/ 28 мая 2020

Попробуйте с

import uuid

public_key = User(public_id = str(uuid.uuid4())

Если вы хотите ограничить до 11 символов

uuid.uuid4().hex[:11]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...