Django,在两个表之间分配多对多关系,并且两个表中都有预定义的值

时间:2019-02-22 09:46:57

标签: django-rest-framework many-to-many

当前,我正在使用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'. 

我不想创建权限,因为它已经在数据库中可用。 我唯一想做的就是存储组和权限之间的链接。 (将现有权限分配给现有组)。 谢谢

1 个答案:

答案 0 :(得分:0)

更改以下

 permissions = PermissionSerializer(many=True)

 permissions = PermissionSerializer(read_only=True, many=True)

更新

在django-restframework-serializer周期中,有一些事情是按顺序进行的。至于您的情况,我的假设是如何通过权限字段验证检查。每当您声明另一个序列化程序,而该序列化程序在PermissionSerializer的此期望以下字段中应通过该序列化程序的验证时,则需要codenamename且肯定不通过它们,这就是为什么您得到该错误。如果我们将该字段分配为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

相关问题