如何在Dnago中使用户名字段不区分大小写?我的实现正确吗?

2024-04-29 08:32:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Django和Django Rest框架开始我的web项目。我希望我的用户名字段不区分大小写,因此我在网上搜索了如何实现它,找到了这个漂亮的博客:https://simpleisbetterthancomplex.com/tutorial/2017/02/06/how-to-implement-case-insensitive-username.html。他建议这样做:

from django.contrib.auth.models import AbstractUser, UserManager

class CustomUserManager(UserManager):
    def get_by_natural_key(self, username):
        case_insensitive_username_field = '{}__iexact'.format(self.model.USERNAME_FIELD)
        return self.get(**{case_insensitive_username_field: username})

class CustomUser(AbstractUser):
    objects = CustomUserManager()

为了型号.py你知道吗

但是当我写测试的时候,他们失败了,因为User.objects.get\u by \u自然\u键当我创建两个用户名相同但大小写不同的用户时,返回了两个user对象(例如:“aniket”和“aniket”)。你知道吗

所以,我通过了这个方法:

from django.contrib.auth.models import UserManager, AbstractUser
# Create your models here.


class CustomUserManager(UserManager):
    def create_user(self, username, email=None, password=None, **extra_fields):
        return super().create_user(username.lower(),email,password,**extra_fields)

    def create_superuser(self, username, email, password, **extra_fields):
        return super().create_superuser(username.lower(),email,password,**extra_fields)

    def get_by_natural_key(self, username):
        case_insensitive_username_field = '{}__iexact'.format(self.model.USERNAME_FIELD)
        return self.get(**{case_insensitive_username_field: username})

class User(AbstractUser):
    objects = CustomUserManager()

那么,这种方法是否符合要求?你知道吗


Tags: selffieldgetreturnemaildefcreateusername