不能对没有`.queryset`属性的视图应用DjangoModelPermissions或覆盖`.get_queryset()`方法

时间:2015-07-10 08:16:04

标签: python django django-rest-framework

我收到错误" .accepted_renderer没有设置在Response resp api django"。

我正在关注django rest-api教程。 Django版本我使用的是1.8.3 我按照教程直到第一部分。它运作正常。但是当我继续发送回复的第二部分时,我收到了错误

Cannot apply DjangoModelPermissions on a view that does not have `.queryset` property or overrides the `.get_queryset()` method.

然后我尝试了其他方式

.accepted_renderer not set on Response resp api django

请帮帮我。我认为它的许可问题。

6 个答案:

答案 0 :(得分:72)

您可能已在设置中将DjangoModelPermissions设置为默认权限类。类似的东西:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.DjangoModelPermissions',
    )
}

DjangoModelPermissions只能应用于具有.queryset属性或.get_queryset()方法的视图。

由于教程2使用FBV,您可能需要将其转换为CBV,或者简单的方法是为该视图指定不同的权限类。 您必须在视图中使用api_view装饰器。然后,您可以定义permissions,如下所示:

from rest_framework.decorators import api_view, permission_classes
from rest_framework import permissions

@api_view([..])
@permission_classes((permissions.AllowAny,))
def my_view(request)
    ...

要解决渲染器错误,您需要将相应的渲染器添加到您的设置中。

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.<corresponding_renderer>',
        ...
    )
}

答案 1 :(得分:15)

我让它以另一种方式工作。 我登录的用户是我创建的超级用户。 所以我从管理员创建了另一个用户并使他成为用户并提供了所有权限。然后由该用户登录到管理员。

在settings.py文件中,我更改了代码。

REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ]
}

它有效。

答案 2 :(得分:4)

对我的解决方案正如@ProfNandaa上面指出的那样

  

快速修复,注释掉   'rest_framework.renders.DjangoModelPermissions'行现在 - 如果你   遵循DRF教程2;也许你已经添加了   主页示例中的settings.py。

在开始使用教程并遇到同样的问题之前,我确实从主页示例中添加了这个。

当我评论出有问题的代码时

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.DjangoModelPermissions',
    )
}
来自settings.py的

一切都恢复正常。

答案 3 :(得分:2)

就我而言,(对于教程2,djangorestframework ver 3.7.7),当我将设置更改为:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny',
    ]
}

答案 4 :(得分:1)

这里列出了很多好的解决方案。我在第二个教程中也遇到了同样的问题。它显示:

  

无法对视图执行DjangoModelPermissionsOrAnonReadOnly   未设置.queryset或使用.get_queryset()方法。

我更改了settings.py以排除DEFAULT_PERMISSION_CLASSES,如下所示:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
    ]
}

然后它成功运行。在我找到这些答案之前,我试过这个。

答案 5 :(得分:1)

Django Rest Framework's documentation,中,您可以将其添加到视图中:

queryset = User.objects.none()