簡體   English   中英

Django:具有自動遞增 ID 的自定義用戶 Model

[英]Django: Custom User Model with Autoincrementing Id

我正在嘗試使用 Django 身份驗證,我想為具有自動遞增 integer 作為 ID 的用戶創建自定義 model。 我知道 uuid 庫,但我希望 id 是一個 integer 數字,這就是為什么我想避免它。

我的代碼看起來像:

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager


class MyAccountManager(BaseUserManager):
    def create_user(self, first_name, last_name, email, username, avatar, password=None):
        if not username:
            raise ValueError('User must have an username')

        if not avatar:
            raise ValueError('User must have an avatar')

        user = self.model(
            email=self.normalize_email(email),
            username=username,
            avatar=avatar,
            first_name=first_name,
            last_name=last_name
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, first_name, last_name, email, username, avatar, password):
        user = self.create_user(
            email=self.normalize_email(email),
            username=username,
            avatar=avatar,
            password=password,
            first_name=first_name,
            last_name=last_name
        )
        user.is_admin = True
        user.is_active = True
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)
        return user


class Account(AbstractBaseUser):
    id = models.AutoField(primary_key=True)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    username = models.CharField(max_length=50, unique=True)
    email = models.CharField(max_length=50, unique=True)
    avatar = models.CharField(max_length=200)

    # required
    is_admin = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_superadmin = models.BooleanField(default=False)

    USERNAME_FIELD = 'id'
    REQUIRED_FIELDS = ['username', 'first_name', 'last_name', 'email', 'avatar']

    objects = MyAccountManager()

    def __str__(self):
        return self.username

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

    def has_module_perms(self, add_label):
        return True

問題是我仍然想用用戶名登錄,而不是 id。 此外,因為它是自動遞增的,所以當我從控制台創建超級用戶時不必手動引入它會很好。

這可能嗎?

我試圖解決你的要求......使用保存方法覆蓋

Model 代碼:

class CustomUserModel(AbstractBaseUser, PermissionsMixin):
    auto_id = models.PositiveBigIntegerField(unique=True)
    username = models.CharField(max_length=255, unique=True)
    email = models.EmailField(verbose_name="email address", max_length=255, unique=True)
    mobile_no = models.PositiveIntegerField(verbose_name="mobile number",unique=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    date_joined = models.DateTimeField(default=timezone.now)

    objects = CustomUserManager()

    USERNAME_FIELD = "username"
    REQUIRED_FIELDS = ['email','mobile_no']

    def save(self, *args, **kwargs):
        count_id = CustomUserModel.objects.all().count()
        self.auto_id = count_id+1
        super(CustomUserModel, self).save(*args, **kwargs)
    
    def __str__(self):
        return self.email

Output 管理面板查看:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM