django - 使用 Guardian 检查序列化子对象的权限
问题描述
我有三个模型,其中一个文档有很多块,一个块有很多评论。
class Document(models.Model):
name = models.Charfield()
class Block(models.Model):
document = models.ForeignKey(to=Document)
class Comment
block = models.ForgeinKey(to=Block)
用户可以拥有Document
允许他们查看其中所有Block
s 的权限。用户还可以将Comment
s 添加到其他用户可以共享的任何块中。我使用django-guardian来管理基于对象的权限。
我创建了一个RetrieveAPIView
使用 Django Rest Framework 来使文档可用。
class DocumentDetailView(PermissionRequiredMixin, RetrieveAPIView):
serializer_class = DocumentSerializer
permission_required = "document.view_document"
为了在该视图中包含所有块及其注释,我使用以下序列化程序(class Meta
为简洁起见省略):
class DocumentSerializer(serializers.ModelSerializer):
blocks = BlockSerializer(many=True, source="block_set")
class BlockSerializer(serializers.ModelSerializer):
comments = serializers.CommentSerializer(many=True, source="comment_set")
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = Comment
我想将包含的评论限制DocumentDetailView
为用户有权访问的评论。按照 django-guardian 的逻辑,我将使用get_objects_for_users()
, 来过滤Block.comment_set.all()
. 然而,我不知道在哪里做这个。
我想将评论限制为可用于的评论request.user
,基于权限的过滤应该在 中完成DocumentDetailView
,但我不知道如何在get_object()
.
解决方案
我不太了解,django-guardian
但我想您可以覆盖该get_queryset
方法:
class DocumentDetailView(PermissionRequiredMixin, RetrieveAPIView):
serializer_class = DocumentSerializer
permission_required = "document.view_document"
def get_queryset(self):
if self.check_permissions():
queryset = super().get_queryset()
return queryset.filter(...) # <- here you permission filter
推荐阅读
- flutter - 在 DART 的 GETTER 中使用字符串作为返回类型时出错
- maven - 如何将 Maven 发布插件与 Nexus 暂存插件结合使用?
- javascript - 如何动态控制indicatorStyle反应导航5倍
- android - Android 应用程序,例如移动浏览器版本
- javascript - 如何在redux saga中获取具有不同参数的端点
- python - 可广播条件的 Numpy
- react-native - 如何像标签一样创建从一个组件到下一个组件的超链接?
- azure-devops - 克隆存储库后 Azure DevOps 强制 core.hooksPath
- html - 我的表没有从我的外部 css 继承其样式
- python - 如何从 sr 函数中获取 scapy IP 地址列表结果到变量中