无法在没有“.queryset”属性 或覆盖“.get_queryset()”方法的视图上应用 DjangoModelPermissions

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

我收到错误消息“.accepted_renderer 未在 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

请帮帮我。我认为是权限问题。

您可能在设置中将 DjangoModelPermissions 设置为默认权限 class。类似于:

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

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

由于教程 2 使用 FBV,您可能需要将其转换为 CBV,或者一种简单的方法是为该视图指定不同的权限 class。 您必须在视图中使用 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>',
        ...
    )
}

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

我在 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',
    ]
}

它奏效了。

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

Quick fix, comment out the 'rest_framework.renders.DjangoModelPermissions' line for now -- if you are following the DRF Tutorial 2; and perhaps you had added that in settings.py during the homepage example.

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

当我注释掉违规代码时

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

从 settings.py 开始一切正常。

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

Cannot apply DjangoModelPermissionsOrAnonReadOnly on a view that does not set .queryset or have a .get_queryset() method.

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

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
    ]
}

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

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

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

来自 Django Rest Framework's documentation, 您可以将此添加到您的视图中:

queryset = User.objects.none()