如何通过ForeignKey检查获取对象的用户权限

2024-03-29 05:35:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个Django{}的形式:

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)

我正在使用^{}强制执行对象级权限。实际应用程序有大量嵌套对象,并且发现为每个嵌套对象创建所有权限对象的写入性能非常慢。因此,User被授予对顶级对象的权限(在本例中为Car

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

如何使用^{}获取Wheel对其父Car具有适当权限的所有Wheel

特别是试图重写^{}^{},以支持基于对象的ForeignKey之一的权限筛选对象


Tags: 对象djangofromrest权限modelmodelscar
1条回答
网友
1楼 · 发布于 2024-03-29 05:35:07

我通过定义这个Filter用于Wheel{}{}来实现这一点:

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)

相关问题 更多 >