Django DRF创建用户时如何按角色名为用户分配多个角色
解决方案
你需要修改序列化器的role字段定义,同时调整create方法的批量关联逻辑,两步即可实现需求:
第一步:修改序列化器的role字段,指定用role_name作为输入匹配项
默认DRF的ModelSerializer对ManyToMany关联字段会使用PrimaryKeyRelatedField,也就是默认传主键ID,你需要手动把它改成SlugRelatedField,指定用role_name作为匹配字段:
class UserSerializer(serializers.ModelSerializer): # 新增这行,指定role字段用slug匹配,关联字段是UserRole的role_name,many=True支持传数组 role = serializers.SlugRelatedField( many=True, slug_field='role_name', queryset=UserRole.objects.all() ) class Meta: model = User fields = ('username', 'email', 'first_name', 'last_name', 'role', 'password') extra_kwargs = {'password': {'write_only': True}}
这里SlugRelatedField会自动帮你校验传入的字符串是否是UserRole表中存在的role_name值,不符合的话会直接返回参数错误,不需要自己额外写校验逻辑。
第二步:修改create方法的角色关联逻辑,支持批量添加
你现在的代码里只取了role_data[0]也就是第一个角色,改成遍历所有传入的角色批量添加即可:
def create(self, validated_data): # 这里的role_data已经是SlugRelatedField帮你查出来的UserRole对象数组了,不用自己再查 role_data = validated_data.pop('role') password = validated_data.pop('password') user = User(**validated_data) user.set_password(password) user.save() profile_data = { "display_name": validated_data['first_name'], "fullname": f"{validated_data['first_name']} {validated_data['last_name']}", "dob": None, "address": None, "country": None, "city": None, "state": None, "zip_code": None, "profile_avatar": None } UserProfile.objects.create(user=user, **profile_data) # 直接把整个role_data数组传入add方法即可批量关联 user.role.add(*role_data) return user
额外注意
你当前的UserRole模型的ROLE_CHOICES里写了SUPER_ADMIN选项,但是类里没有定义SUPER_ADMIN常量,记得补上否则会报错:
class UserRole(HRMBaseModel): HR = 'HR' IT = 'IT' ADMIN = 'ADMIN' FINANCE = 'FINANCE' EMPLOYEE = 'EMPLOYEE' PROJECT_MANAGER = 'PROJECT MANAGER' # 补上这行 SUPER_ADMIN = 'SUPER_ADMIN'
修改完成后就可以直接用你期望的"role": ["IT", "ADMIN", "HR"]格式传参创建用户了。
内容的提问来源于stack exchange,提问作者T.M
相关产品推荐
相关产品推荐

