首页 > 解决方案 > 在 django rest 中自动生成随机用户名

问题描述

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

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. 你应该ValidationError只从validate函数中提高。
  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
        ...

推荐阅读