首页 > 解决方案 > 如何通过 ForeignKey 检查 django-guardian get_objects_for_user 权限

问题描述

我有两个 DjangoModel的形式:

from django.db import models


class Car(models.Model):
    pass

class Wheel(models.Model):
    car = models.ForeignKey(Car, related_name='wheels', on_delete=models.CASCADE)

django-guardian用来强制执行对象级权限。实际应用中有大量嵌套对象,发现为每个嵌套对象创建所有权限对象的写入性能非常慢。因此,Users 被授予顶级对象的权限(Car在这个玩具示例中)。

在访问的 REST 端点上,Wheel通过向上移动外键(在本例中)来检查Django REST Framework权限,以验证 a是否应该有权访问特定的.Wheel.carUserWheel

如何get_objects_for_user用于获取a对其 parent 具有适当权限的所有Wheels ?UserCar

特别是试图覆盖django-rest-framework-guardian'sObjectPermissionsFilter.filter_queryset以支持根据其中一个ForeignKeys 的权限过滤对象。

标签: pythondjangodjango-rest-frameworkpermissionsdjango-guardian

解决方案


Filter通过将其定义为与以下内容一起使用,我能够使其工作Wheel ViewSet filter_backends

from rest_framework.filters import BaseFilterBackend


class CarObjectPermissionsFilter(BaseFilterBackend):
    perm_format = '%(app_label)s.view_%(model_name)s'

    def filter_queryset(self, request, queryset, view):
        permission = cls.perm_format % {
            'app_label': Car._meta.app_label,
            'model_name': Car._meta.model_name,
        }
        car_ids = get_objects_for_user(user, permission, Car.objects.values_list('pk', flat=True))
        return queryset.filter(car__in=car_ids)

推荐阅读