给组添加权限 - Django-rest-framework

问题描述

我正在编写一个 REST API 来创建组并为该组分配权限。

问题: 如何创建 POST 方法,以便我可以创建具有这些权限的组。

enter image description here

这是到目前为止我来的代码片段

Groupserializer

class GroupSerializer(serializers.ModelSerializer):    
class Meta:
    model = Group
    fields = ('name','permissions')

观看次数

class UsersGroupCreateView(APIView):
permission_classes = [IsAdminUser]

def post(self,request,*args,**kwargs):
    serializer = GroupSerializer(data = request.data)
    
    if serializer.is_valid():
        data = serializer.validated_data
        group = Group.objects.create(name = data.get('name'),permissions = 
                                     data.get('permissions'))
    
        return Response({"status":"Group Created"},status=status.HTTP_201_CREATED)
    return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST

class GetPerm(APIView):

def get(self,**kwargs):

    permissions = serializers.serialize('json',Permission.objects.all())
    return Response(permissions)
    

来自 GetPerm() 的权限具有以下数据:

"[{"model": "auth.permission","pk": 1,"fields": {"name": "可以添加日志条目","content_type": 1,"codename": "add_logentry "}},{"model": "auth.permission","pk": 2,"fields": {"name": "Can change log entry","codename": "change_logentry" }},"pk": 3,"fields": {"name": "可以删除日志条目","codename": "delete_logentry"} },"pk": 4,"fields": {"name": "可以查看日志条目","codename": "view_logentry"}} ]"

对不起,如果我不太清楚 任何帮助将不胜感激!

解决方法

正如错误所述,您不能在第一次创建对象时直接分配 ManyToMany 关系。您需要在之后手动完成:

 # ...
    if serializer.is_valid():
        data = serializer.validated_data

        group = Group.objects.create(name = data.get('name'))
        [group.permissions.add(p) for p in data.get('permissions')]
    
        return Response({"status":"Group Created"},status=status.HTTP_201_CREATED)
    return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)


# ...
,

我想通了,就像这样。

        group = Group.objects.create(name = data.get('name'))
        try:
            permissions = request.data.get('permissions')
            for permission_index in permissions:
                permission=Permission.objects.get(id=permission_index)
                group.permissions.add(permission)
        except Exception as e:
            print("Error in creating")
        return Response({"status":"Group Created"},status=status.HTTP_201_CREATED)

还要感谢@afonso。