当前,我正在使用django rest框架。我想以rest api形式复制django的默认角色权限选择。 我已经在其中列出了auth_group的权限。 问题是:权限和组已在数据库中获取。我只想使用django的默认表在组和权限之间创建链接。 (我想为组分配权限。)
这是我的序列化器。
class PermissionSerializer(serializers. HyperlinkedModelSerializer):
class Meta:
model = Permission
fields = (
'pk',
'codename',
'name'
)
read_only_fields = ('pk',)
class UserGroupSerializer(serializers. HyperlinkedModelSerializer):
permissions = PermissionSerializer(many=True, read_only=True)
class Meta:
model = Group
fields = (
'pk',
'name',
'permissions'
)
read_only_fields = ('pk',)
def create(self, validated_data):
"""
Overriding the default create method of the Model serializer.
"""
permission_data = validated_data.pop('permissions')
group = Group.objects.create(**validated_data)
for permission in permission_data:
permissionNow = Permission.objects.get(name='view_profile')
group.permissions.add(permissionNow)
return group
views.py
def index(request):
# retrive all users or create a user
if request.method == 'GET':
groups = Group.objects.all()
serializer = UserGroupSerializer(groups, many=True)
return Response(serializer.data)
def create(request):
if request.method == 'POST':
serializer = UserGroupSerializer(data = request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
当前,它给出
Exception Type: KeyError
Exception Value:
'permissions'.
我不想创建权限,因为它已经在数据库中可用。 我唯一想做的就是存储组和权限之间的链接。 (将现有权限分配给现有组)。 谢谢
答案 0 :(得分:0)
更改以下
permissions = PermissionSerializer(many=True)
到
permissions = PermissionSerializer(read_only=True, many=True)
在django-restframework-serializer周期中,有一些事情是按顺序进行的。至于您的情况,我的假设是如何通过权限字段验证检查。每当您声明另一个序列化程序,而该序列化程序在PermissionSerializer
的此期望以下字段中应通过该序列化程序的验证时,则需要codename
和name
且肯定不通过它们,这就是为什么您得到该错误。如果我们将该字段分配为read_only,则检查将绕过。我希望您可以在validated_data中获得许可,如果不存在,可以通过覆盖的self.context['request']data.get('permissions')
方法从create
获得许可。
UserGroupSerializer应该像这样
class UserGroupSerializer(serializers. HyperlinkedModelSerializer):
permissions = PermissionSerializer(many=True, read_only=True)
class Meta:
model = Group
fields = (
'pk',
'name',
'permissions'
)
read_only_fields = ('pk',)
def create(self, validated_data):
"""
Overriding the default create method of the Model serializer.
"""
permission_data = self.context['request'].data.get('permissions')
group = Group.objects.create(**validated_data)
for permission in permission_data:
permissionNow = Permission.objects.get(name='view_profile')
group.permissions.add(permissionNow)
return group
在视图中
def create(request):
if request.method == 'POST':
serializer = UserGroupSerializer(data = request.data, context={'request': request})
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
如何将上下文数据传递给序列化器,相关阅读link