我正在尝试使用DjangoModelPermissions,但它似乎无法正常工作。
这是代码:
class TestViewSet(viewsets.ModelViewSet):
model = Test
serializer_class = serializers.TestSerializer
permission_classes = (permissions.DjangoModelPermissions,)
def create(self, request):
response_data = {}
response_data['type'] = 'error'
data=json.loads(request.raw_post_data)
test = Test.objects.create(name=data['name'],\
description=data['description'],\
start_date=data['start_date'],\
end_date=data['end_date'])
#save changes
test.save()
return Response({'status': 'ok', "result": test.id})
我不认为这种情况有任何区别,但我使用的是django_mongodb_engine。
我有一个没有权限的用户,它可以创建测试实例。另一方面,我如何阻止GET,以便具有正确权限的用户可以执行该操作?
由于
答案 0 :(得分:1)
DRF 文档中清楚地解释了 DjangoModelPermissions 在这里不起作用的原因
<块引用>“此权限只能应用于具有 .queryset 属性或 get_queryset() 方法的视图。”
解决办法是:
将查询集添加到您的模型
class TestViewSet(viewsets.ModelViewSet):
serializer_class = serializers.TestSerializer
permission_classes = (permissions.DjangoModelPermissions,)
queryset = Test.objects.all()
或者如果您想覆盖默认的查询集方法,请随意使用此方法
def get_queryset(self):
return super().get_queryset()
另外,我注意到您不必在 ModelViewSet 中指定模型。如果您在 TestSerializer 中指定您的测试模型,则只需在 ModelViewSet 中指定序列化程序,这就是 DRF 的工作原理
答案 1 :(得分:0)
我的问题是一样的。尽管具有权限类,用户仍可以在数据库中创建新实例。我调查了django-guardian,发现该后端应为默认值:
2018-10-29 12:40:14,009 - ERROR - http_protocol - Traceback (most recent call last):
File "..\venv\lib\site-packages\daphne\http_protocol.py", line 176, in process
"body": self.content.read(),
MemoryError
因此,我将其添加到settings.py文件中,现在它可以工作了,并且没有权限的用户无法创建新实例。希望对您有所帮助。
答案 2 :(得分:-1)
你需要让django-guardian使用DRF让DjangoModelPermissions正常工作。它也在DjangoModelPermissions段落下的原始文档http://www.django-rest-framework.org/api-guide/permissions中提到
如果仍然无法正常工作,请告知我们