【问题标题】:generate random username automatically in django rest在 django rest 中自动生成随机用户名
【发布时间】:2021-05-22 02:54:19
【问题描述】:

有没有办法自动生成用户名。而且我在登录时还需要用户名,所以它必须是唯一的-

class User(AbstractUser):
    username = models.CharField(max_length=50, unique=True, null= False, blank=False)
    email = models.EmailField(unique=True, null=False, blank=False)
    USERNAME_FIELD = 'username'
    def __str__(self):
        return "{}".format(self.email)

下面是用户创建序列化程序的代码:

class UserSerializer(serializers.HyperlinkedModelSerializer):
profile = UserProfileSerializer(required=True)
username = serializers.CharField(label="username field",
                                     required=True, allow_null=False,
                                     allow_blank=False)

class Meta:
    model = User
    fields = ('id', 'username', 'email', 'first_name', 'last_name', 'password', 'profile')
    extra_kwargs = {'password': {'write_only': True}, 'first_name': {'required': True},
                    'last_name': {'required': True}}

def create(self, validated_data):
    profile_data = validated_data.pop('profile')
    password = validated_data.pop('password')
    try:
        if User.objects.filter(username__iexact=User(**validated_data).username).exists():
            raise serializers.ValidationError("username already exists")
    except Exception as e:
            error = {'message': ",".join(e.args) if len(e.args) > 0 else 'Unknown Error'}
            raise serializers.ValidationError(error)
    user = User(**validated_data)
    print(user.username)
    user.set_password(password)
    user.save()
    UserProfile.objects.create(user=user, **profile_data)
    return user

我应该做哪些改变来自动生成用户名?

【问题讨论】:

    标签: django-rest-framework


    【解决方案1】:
    1. 您应该只从 validate 函数中引发 ValidationError
    2. 使用管理器创建对象。 User 模型内置了 create_user 方法。
    3. 要生成用户名,您可以使用 coolname 等库。
    4. 创建两个序列化程序。一个用于创建用户,另一个用于阅读。
    5. 如果您想允许用户指定自己的用户名,请在字段中添加验证器。
    6. 将配置文件创建移动到create_user 方法。
    from coolname import generate_slug
    
    class UserCreateSerializer(serializers.HyperlinkedModelSerializer):
        username = serializers.CharField(
            min_length=3, 
            max_length=50, 
            validators=[UniqueValidator(queryset=User.objects.all())], 
            allow_null=True, 
            default=None
        )
    
        class Meta:
            model = User
            fields = ('username',)
    
        def validate_username(self, val):
            return val or generate_slug()
        
        def perform_create(self, validated_data):
            # use User manager
            ...
    

    【讨论】:

      【解决方案2】:

      你可以使用这个方法:from allauth.utils import generate_unique_username

      然后你可以像这样生成唯一的用户名:

      # Create user object
      first_name = 'My firstname'
      last_name = 'My lastname'
      email = 'myemail@gmail.com'
      
      user = User()
      user.first_name = first_name
      user.last_name = last_name
      user.email = email
      user.username = generate_unique_username([f'{first_name} {last_name}', email, 'user'])
      user.save()
      

      【讨论】:

        猜你喜欢
        • 2020-11-21
        • 2011-10-26
        • 1970-01-01
        • 2018-01-19
        • 1970-01-01
        • 1970-01-01
        • 2014-04-07
        • 2011-09-15
        • 2011-05-23
        相关资源
        最近更新 更多