如何在 Django Rest Framework 中序列化用户权限?

dan*_*boy 0 django django-rest-framework

我正在构建一个带有 Django Rest 后端和 React 前端的应用程序,并致力于授权和身份验证。身份验证效果很好,但是当我告诉前端用户有权对模型进行添加/编辑/查看/删除时,我有点卡住了。例如,如果用户无法编辑故事,我不想显示“编辑故事”按钮。

在处理 Django 文档时,我认为将用户的权限从 Django 后端发送到 React 前端是最简单的。因此我想序列化用户权限。

这是我的观点

class UserAPI(generics.RetrieveAPIView):
  permission_classes = [
    permissions.IsAuthenticated, 
  ]
  serializer_class = UserSerializer

  def get_permissions(request):
    logged_in_user = request.user
    return Response(data=logged_in_user.get_all_permissions())

  def get_object(self):
    return self.request.user

Run Code Online (Sandbox Code Playgroud)

这是我的序列化器

class UserSerializer(serializers.ModelSerializer):
  class Meta:
    model = User
    fields = ('id', 'username', 'user_permissions')
Run Code Online (Sandbox Code Playgroud)

用户型号

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.jpg', upload_to='profile_pics/')


    def __str__(self):
        return f'{self.user.username} Profile'

    def save(self, *args, **kwargs):
        super(Profile, self).save(*args, **kwargs)

        img = Image.open(self.image.path)

        if img.height > 300 or img.width > 300:
            output_size = (300,300)
            img.thumbnail(output_size)
            img.save(self.image.path)

Run Code Online (Sandbox Code Playgroud)

当我调用 UserAPI 时,字段 user_permissions 为空。

 "user": {
        "id": 35,
        "username": "HII",
        "user_permissions": [
        ]
    }
Run Code Online (Sandbox Code Playgroud)

我想知道如何无法通过 API 访问 user_permission。我很高兴得到任何提示和澄清。

Utk*_*klı 5

当我需要类似的东西时,我使用 SerializerMethodField。您可以添加 SerializerMethodField 并设置 auth 用户拥有的所有权限。

class UserSerializer(serializers.ModelSerializer):
    user_permissions = serializers.SerializerMethodField()
    class Meta:
        model = User
        fields = ('id', 'username', 'user_permissions')
    def get_user_permissions(self, obj):
        return list(obj.user_permissions.all()) # I'm not sure list type casting is necessary
Run Code Online (Sandbox Code Playgroud)