使用对象权限时,如何将 ModelAdmin 查询集限制为用户可编辑的项目?

发布于 2024-09-02 19:18:04 字数 232 浏览 3 评论 0原文

我正在尝试实现 Florian 在 Django Advent 文章中的 对象权限系统,但是我我遇到了一个问题,试图将查询集限制为仅返回用户有权编辑/查看的项目。 Florian 在他关于包装管理的部分中提到了这一点,但跳过了它。我看不出过滤查询集的好方法。我错过了什么吗?

I'm trying to implement Florian's object permissions system from his article on Django Advent, but I'm running into an issue trying to limit the queryset returned to only items the user has permission to edit/view. Florian mentions it in his section on wrapping the admin, but skips over it. I can't see a good way to filter the queryset. Am I missing something?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

零時差 2024-09-09 19:18:04

当您执行此操作时:

class ObjectPermission(models.Model):
    user = models.ForeignKey(User)
    can_view = models.BooleanField()
    can_change = models.BooleanField()
    can_delete = models.BooleanField()

    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()

您可以通过这种方式过滤您的查询集(在您的方法查询集中):

def queryset(self, request):
    qs = super(YourModelAdmin, self).queryset(request)
    op = ObjectPermission.objects.filter(user=request.user, can_change=True, content_type=ContentType.objects.get_for_model(YourModel)).values_list('object_id').distinct()
    qs = queryset.filter(id__in=[id[0] for id in op])
    return qs 

When you do this:

class ObjectPermission(models.Model):
    user = models.ForeignKey(User)
    can_view = models.BooleanField()
    can_change = models.BooleanField()
    can_delete = models.BooleanField()

    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()

you can filter your query set in this way (in your method queryset):

def queryset(self, request):
    qs = super(YourModelAdmin, self).queryset(request)
    op = ObjectPermission.objects.filter(user=request.user, can_change=True, content_type=ContentType.objects.get_for_model(YourModel)).values_list('object_id').distinct()
    qs = queryset.filter(id__in=[id[0] for id in op])
    return qs 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文