如何通过 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
来实施对象级权限。实际应用中有大量的嵌套对象,发现为每个嵌套对象创建所有权限对象的写入性能非常慢。因此,User
s 被授予对顶级对象的权限(在此玩具示例中为 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
之一的权限过滤对象。
我能够通过定义这个 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)
我有两个 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
来实施对象级权限。实际应用中有大量的嵌套对象,发现为每个嵌套对象创建所有权限对象的写入性能非常慢。因此,User
s 被授予对顶级对象的权限(在此玩具示例中为 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
之一的权限过滤对象。
我能够通过定义这个 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)