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

Gau*_*rav 54 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.
Run Code Online (Sandbox Code Playgroud)

然后我尝试了其他方式

.accepted_renderer not set on Response resp api django
Run Code Online (Sandbox Code Playgroud)

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

Rah*_*pta 83

您可能已在设置中设置DjangoModelPermissions为默认权限类.就像是:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.DjangoModelPermissions',
    )
}
Run Code Online (Sandbox Code Playgroud)

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)
    ...
Run Code Online (Sandbox Code Playgroud)

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

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.<corresponding_renderer>',
        ...
    )
}
Run Code Online (Sandbox Code Playgroud)

  • 快速修复,暂时注释掉''rest_framework.renders.DjangoModelPermissions'行 - 如果您正在关注DRF教程2; 也许你在_homepage_例子中在`settings.py`中添加了它. (8认同)

Gau*_*rav 16

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

在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',
    ]
}
Run Code Online (Sandbox Code Playgroud)

它奏效了.


小智 6

正如上面@ProfNandaa 所指出的,对我来说的解决方案

快速修复,现在注释掉“rest_framework.renders.DjangoModelPermissions”行——如果你正在关注 DRF 教程 2;也许您在主页示例中在 settings.py 中添加了它。

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

当我注释掉有问题的代码时

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.DjangoModelPermissions',
    )
}
Run Code Online (Sandbox Code Playgroud)

从 settings.py 一切又正常了。


ars*_*sho 6

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

无法将 DjangoModelPermissionsOrAnonReadOnly 应用于未设置.queryset或没有.get_queryset()方法的视图。

我将其更改settings.py为排除,DEFAULT_PERMISSION_CLASSES如下所示:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
    ]
}
Run Code Online (Sandbox Code Playgroud)

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


CK.*_*yen 5

就我而言,(对于教程 2,版本djangorestframework3.7.7),当我将设置更改为:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny',
    ]
}
Run Code Online (Sandbox Code Playgroud)