在Django rest框架中创建之前检查对象权限

fab*_*hel 8 python django-rest-framework

使用 ModelViewSet 和 DjangoObjectPermissions。

Django REST 框架似乎不会为“创建”请求 (POST) 调用 check_object_permission。我需要检查用户是否可以在将其保存到数据库之前创建此对象(因为权限检查取决于对象值)

我想我需要覆盖 ModelViewSet 的“创建”方法,但我不知道如何从序列化程序获取实例而不将其保存到数据库。

  1. 如何从序列化程序获取对象实例而不保存到数据库?
  2. 或者如何让 DRF 检查 POST/create 请求的对象权限?

谢谢

编辑:

深入研究 DRF 代码后,我无需保存即可获取实例:

def create(self, request, *args, **kwargs):
    serializer = WorkedHourSerializer(data=request.data)
    if serializer.is_valid():
        instance = MyModel(**serializer.validated_data)
Run Code Online (Sandbox Code Playgroud)

但是 Django 拒绝检查 perm 没有主键的对象,所以我必须强制一个:

        instance.id = 0
        self.check_object_permissions(request, instance)
Run Code Online (Sandbox Code Playgroud)

luc*_*tti 2

  1. 在保存之前无法获取实例(查看更多

  2. 最好的方法似乎是实现自定义权限(可能是子类化rest_framework.permissions.BasePermissionrest_framework.permissions.IsAuthenticated)并添加权限检查的逻辑has_permission(self, request, view)请参阅更多)。这样,您就可以访问request.user,然后能够确定该用户是否有权创建该对象。