django-rest-framework - 在 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
我应该进行哪些更改以自动生成用户名?
解决方案
- 你应该
ValidationError
只从validate
函数中提高。 - 使用管理器创建对象。
User
模型具有内置create_user
方法。 - 要生成用户名,您可以使用诸如
coolname
. - 创建两个序列化程序。一个用于创建用户,另一个用于阅读。
- 如果您想允许用户指定自己的用户名,请在该字段上添加验证器。
- 将配置文件创建移动到
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
...
推荐阅读
- mongodb - MongoDB使用聚合连接两个字段,其中实际字段位于数组中
- python-3.x - 如何获取python中所有列的描述性统计信息
- javascript - 如何在 JavaScript 中暂停和恢复计时器?
- amazon-web-services - AWS Quicksight - 编辑/调整自动生成的查询
- javascript - change()替代方案中的回调函数?
- java - 如何在一个类中创建对象并将它们保存在另一个类中的数组中?
- javascript - 拿来。处理来自服务器的 500 个响应
- c++ - 如何检索指向在单独线程上运行的函数的移动指针?
- loops - 在 netlogo 中循环以创建多个属性
- css - CSS 属性“调整大小”不适用于“粘性”