python - 如何通过 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
用来强制执行对象级权限。实际应用中有大量嵌套对象,发现为每个嵌套对象创建所有权限对象的写入性能非常慢。因此,User
s 被授予顶级对象的权限(Car
在这个玩具示例中)。
在访问的 REST 端点上,Wheel
通过向上移动外键(在本例中)来检查Django REST Framework权限,以验证 a是否应该有权访问特定的.Wheel.car
User
Wheel
如何get_objects_for_user
用于获取a对其 parent 具有适当权限的所有Wheel
s ?User
Car
特别是试图覆盖django-rest-framework-guardian
'sObjectPermissionsFilter.filter_queryset
以支持根据其中一个ForeignKey
s 的权限过滤对象。
解决方案
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)
推荐阅读
- android - 任何人都可以在 xamarin.android 中修复我的 ListView 问题吗?
- rest - 如何通过 REST API 从 TFS 2018 U2 获取 TestPlan
- javascript - 如何知道用户是否在输入中添加或删除字符
- zsh - OSX launchctl ZSH Shell 脚本不等待外部程序完成
- testing - 如果我们在圆周图中有多个开始和停止会发生什么
- node.js - 使用 Typescript 和 JSForce 的 Webpack 编译错误
- python-3.x - 在python中调用函数时没有文件错误
- google-cloud-ml - 从自定义预测类中获取正在运行的项目 ID
- php - PHP如何从相同的字符串创建相同的哈希?
- javascript - 单击按钮时显示不同的组件