如何通过 ForeignKey 检查 django-guardian get_objects_for_user 权限

How to check django-guardian get_objects_for_user permissions via ForeignKey

我有两个 Django Model 的形式:

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)。

在访问 Wheel 的 REST 端点上,通过向上遍历外键(在本例中 Wheel.car)来检查 Django REST Framework 权限,以验证 User应该可以访问特定的 Wheel.

如何使用 get_objects_for_user 获取 User 对其父 Car 具有适当权限的所有 Wheel

特别尝试覆盖 django-rest-framework-guardian's ObjectPermissionsFilter.filter_queryset 以支持根据 ForeignKey 之一的权限过滤对象。

我能够通过定义这个 FilterWheel 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)