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

mcdcgff0  于 2023-02-15  发布在  Python
关注(0)|答案(8)|浏览(118)

我收到错误“.accepted_renderer未在响应响应API django上设置”。
我正在学习django rest-api教程。我使用的是1.8.3版本的Django。我一直学习到第一部分。它工作正常。但是当我继续第二部分发送响应时,我得到了一个错误

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

请帮帮我。我想是许可问题。

9rygscc1

9rygscc11#

您可能已经在设置中将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>',
        ...
    )
}
3qpi33ja

3qpi33ja2#

我用另一种方式让它工作。我登录的用户是我创建的超级用户。所以我从管理员创建了另一个用户,使他成为员工用户,并提供所有权限。然后登录到管理员由该用户。
在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',
    ]
}

而且奏效了。

x6492ojm

x6492ojm3#

在我的例子中,(对于教程2,djangorestframework ver 3.7.7),当我将设置更改为:

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

disho6za4#

我的解决方案是上面@ProfNandaa指出的。
快速修复,现在注解掉'rest_framework.renders.DjangoModelPermissions'行--如果你正在学习DRF教程2;也许您已经在settings.py的主页示例中添加了它。
在开始教程之前,我确实从主页示例中添加了这一点,并遇到了同样的问题。
当我注解掉有问题的代码时

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

从www.example.com上settings.py,一切又恢复正常了。

fcwjkofz

fcwjkofz5#

这里已经列出了很多好的解决方案。我在第二个教程中也遇到了同样的问题。它显示:
无法对未设置.queryset或具有.get_queryset()方法的视图应用DjangoModelPermissionsOrAnonReadOnly。
我更改了settings.py以排除DEFAULT_PERMISSION_CLASSES,如下所示:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
    ]
}

然后它成功地运行。我尝试了这个之前,我已经找到了这些答案。

5lhxktic

5lhxktic6#

从Django Rest Framework的文档中,你可以将其添加到视图中:
queryset = User.objects.none()

7eumitmz

7eumitmz7#

对于测试,您可以使用

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

此设置默认为允许无限制访问。Documentions

ippsafx7

ippsafx78#

如果你使用的是@app_view,那么你只需要删除这个部分:

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

相关问题